python - 计算另一个方法中的python方法调用

标签 python profiling

我实际上正在尝试用 Java 来做这件事,但我正在自学 python,这让我想知道是否有一种简单/聪明的方法可以用包装器或其他东西来做这件事。

我想知道一个特定方法在另一个方法中被调用了多少次。例如:

def foo(z):
    #do something
    return result

def bar(x,y):
    #complicated algorithm/logic involving foo
    return foobar

因此对于每次使用各种参数调用 bar,我想知道 foo 被调用了多少次,也许输出如下:

>>> print bar('xyz',3)
foo was called 15 times
[results here]
>>> print bar('stuv',6)
foo was called 23 times
[other results here]

编辑:我知道我可以在 bar 中打一个计数器,然后在我返回时将其丢弃,但如果你可以用包装器做一些魔术来完成同样的事情,那就太酷了。这也意味着我可以在其他地方重用相同的包装器,而无需修改方法内的任何代码。

最佳答案

听起来几乎像是装饰器的教科书示例!

def counted(fn):
    def wrapper(*args, **kwargs):
        wrapper.called += 1
        return fn(*args, **kwargs)
    wrapper.called = 0
    wrapper.__name__ = fn.__name__
    return wrapper

@counted
def foo():
    return

>>> foo()
>>> foo.called
1

您甚至可以使用另一个装饰器来自动记录一个函数在另一个函数中被调用的次数:

def counting(other):
    def decorator(fn):
        def wrapper(*args, **kwargs):
            other.called = 0
            try:
                return fn(*args, **kwargs)
            finally:
                print '%s was called %i times' % (other.__name__, other.called)
        wrapper.__name__ = fn.__name__
        return wrapper
    return decorator

@counting(foo)
def bar():
    foo()
    foo()

>>> bar()
foo was called 2 times

但是,如果 foobar 最终会调用它们自己,您将需要一个涉及堆栈的更复杂的解决方案来处理递归。然后您将走向一个全面的分析器...

如果您仍在“自学 Python”,可能这种包装装饰器的东西(通常用于魔术)不是理想的选择!

关于python - 计算另一个方法中的python方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1301735/

相关文章:

c++ - 使用 -std=gnu++11 时发现了哪些已知的性能差异

go - net/http/pprof 和 runtime/pprof 的区别

linux - 当我在启用 "memory leak"的情况下编译程序时,Valgrind 报告了 "-pg"?

python - Django 多个模型的外键

python - 在 Python 中使用 Re 删除双空格/制表符组合

python - 如何打印脚本的每一行,因为它仅针对正在运行的顶级脚本运行?

php - 为 cronjobs 记录 CPU 时间、内存峰值等

python - lazy=True 在 (Flask-)SQLAlchemy 中

python - 尝试获取公会角色时出现 Discord API 401 未经授权错误

arrays - Haskell 实时更新和查找性能