性能分析器

3

大约8-9年前,我看到了一个Visual Studio的工具(我不太记得名字),可以可视化函数调用及其性能。我非常喜欢它,所以我想知道Python中是否有类似的工具。假设你有三个函数:

def first_func():
    ...

def second_func():
    ...
    for i in xrange(10):
        first_function()
    ...

def third_func():
    ...
    for i in xrange(5):
        second_function()
    ...

因此,该工具的最终报告如下(包括连接图):
first_func[avg 2ms] <--50 times--< second_func[avg 25ms] <--5 times--< third_func[avg 140ms]

这样的工具可以更容易地找到系统中的瓶颈,特别是对于大型系统而言。


@eat_a_lemon :)) 如果我找不到类似的东西,我会尝试自己实现。在开始工作之前,我只是想检查一下是否有类似的东西。 - pocoa
3个回答

5

是的,它很有用,但它的报告没有提供有关函数之间关系的任何信息,你需要自己弄清楚。 - pocoa
1
@pocoa:没错,但是获取指标是困难的部分。从那里开始,您可以编写自己的Python脚本,以允许您选择要比较的函数的数据。我认为您很难找到一个可以自动比较“魔术”函数的工具。我说“魔术”是因为只有您知道要比较哪些类似逻辑的函数。 - Aaron Smith

2

使用分析器按行计时和执行频率:

首先,安装line_profiler

其次,通过给要测量的函数添加@profile装饰器来修改源代码。

第三步,运行命令:kernprof -l -v yourscript.py

-l选项告诉kernprof将@profile装饰器注入到您脚本的builtins中,-v选项告诉kernprof在脚本完成后显示计时信息。

输出:

enter image description here


1

通常人们认为需要知道的是函数被调用的次数、花费的时间(自身 vs. 包含)以及谁调用了谁多少次。

然后你可以戴上侦探帽子,希望能够找出问题所在。

还有另一种方法,就是不问函数,而是问代码行,在堆栈上占用了多少墙钟时间的百分比。原因是,如果这样的一行代码可以通过避免它、删除它或以不同的方式完成其工作来不花费时间,那么这个百分比就是可以节省的时间。 你不必成为侦探来定位它。 你的代码中任何瓶颈都必须出现在这样的一行中,精确的百分比并不重要。 这里有一个例子。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接