Python 性能分析器信息不足

2 投票
2 回答
1054 浏览
提问于 2025-04-16 12:28

我正在尝试找出为什么某个函数执行得这么慢。
我像这样使用了性能分析工具:

ipdb> import profile
ipdb> profile.runctx('report.generateOutput()', globals(), locals())
         1 function calls in 40.783 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        0    0.000             0.000          profile:0(profiler)
        1   40.783   40.783   40.783   40.783 profile:0(report.generateOutput())

但是你看,这个信息并没有太大用处。
我需要的是一些详细的信息,告诉我时间都花在哪里了,我这里缺少了什么?

2 个回答

2

使用 profile report.generateOutput(),而不是直接调用这个函数。

如果你想要对一个以 foo() 为主入口的应用进行性能分析,你需要在你的模块中添加以下内容:

import cProfile
cProfile.run('foo()')

也许 Python 的性能分析文档 会对你有帮助。

0

你说了两件不同的事情:

  • “我需要一些关于时间花在哪里的详细信息。”

  • “我想知道为什么某个函数执行得很慢。”

你看,这两者并不是一回事。我觉得问为什么比问哪里更好,因为哪里其实是个模糊的概念。

举个例子,假设有一个“瓶颈”,是对一个大字符串数组进行冒泡排序。时间花在哪里呢?是在冒泡排序的内部循环中,还是在字符串比较上?性能分析工具可能会说是后者,但真正的问题和原因其实是在调用栈的更高层。

这里有个例子,展示了我是怎么做的。

撰写回答