性能分析器

3 投票
3 回答
2578 浏览
提问于 2025-04-16 16:11

大约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]

像这样的工具可以更容易地找到系统中的瓶颈,尤其是对于大型系统来说。

3 个回答

1

我们常常会想,了解函数被调用的次数、它们花费的时间(自我时间和总时间),以及谁在调用谁的频率,这些信息就足够了。这样我们就可以像侦探一样,找出问题所在。

但还有一种方法,就是不关注函数,而是关注代码的每一行,看看它们在整个运行时间中占了多少比例。原因是,如果某一行代码能够通过避免执行、删除或者用其他方式完成它的工作而不花时间,那么这个比例就是你可以节省的时间。你不需要当侦探也能找到问题所在。

代码中的任何瓶颈都会表现为这样的某一行,而具体的百分比并不重要。这里有一个例子。

2

逐行计时和执行频率的工具使用方法:

首先,安装 line_profiler

其次,修改你的源代码,在你想要测量的函数前加上 @profile 这个装饰器。

第三,运行 kernprof -l -v yourscript.py

这里的 -l 选项是告诉 kernprof 在你的脚本的内置函数中加入 @profile 装饰器,而 -v 则是让 kernprof 在你的脚本运行完后显示计时信息。

输出结果:

在这里输入图片描述

5

你可以使用随 Python 安装包一起提供的性能分析工具。点击这里查看 Python 性能分析工具的详细信息

撰写回答