【问题标题】:Python: How to profile non-function operations?Python:如何分析非函数操作?
【发布时间】:2014-07-24 18:21:42
【问题描述】:

我开始学习 Python,很快发现循环、函数调用和这类事情有很多开销。我发现配置文件模块非常有用,但它似乎只显示函数调用而不是基本操作。例如:

import profile

def funct(n):
    myrange = range(n)
    for i in myrange:
        for j in myrange:
            pass

profile.run("funct(10000)")

产生以下输出:

5 function calls in 2.556 seconds

Ordered by: standard name

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000    0.000    0.000 :0(range)
    1    0.001    0.001    0.001    0.001 :0(setprofile)
    1    0.000    0.000    2.555    2.555 <string>:1(<module>)
    1    0.000    0.000    2.556    2.556 profile:0(funct(10000))
    0    0.000             0.000          profile:0(profiler)
    1    2.555    2.555    2.555    2.555 profiler.py:3(funct)

实际上几乎没有函数调用,但时间仍然很长。此外,用“a == b”之类的简单语句替换通过线会进一步延长计算时间(在本例中为 8.4 秒)。

是否有可能从探查器中获取更多关于函数调用运行时的信息?如果没有,还有什么我可以用来获取更多分析信息的东西吗? (比如我使用了多少比较操作,赋值等)

真的,我看到我的程序的总运行时间是 2.555 秒,但分析列表的所有总时间加起来只有 0.001。我想看看其他时间都去哪儿了。我也会将此应用于更复杂的代码,而不是这个简单的示例。我已尝试搜索有关此的信息,但我找不到任何东西(或者我正在寻找错误的东西)。

最后,我想使用这些信息来查找有关我的代码中的瓶颈的更详细信息。尝试以我刚才询问的方式从分析中获得更多信息可能不是正确的方法,所以如果我可以做更好的事情,请随时解决这个问题。

【问题讨论】:

  • 您获得的输出只是分析器收集的信息的一小部分。详细数据在 cachegrind 文件中,可以通过各种工具进行可视化。有关示例,请参阅my answer on Profiling。虽然我不能 100% 确定你是否能够挖掘出比函数调用更多的东西 - 但它肯定应该通过可视化调用图来更容易地找到你的瓶颈。
  • (注意:如果您不想使用我的回答中提到的profilestats 包装器,但仍将配置文件结果写入文件,请直接使用Profile class 而不是profile.run() )

标签: python profiling


【解决方案1】:

您可以使用timeit 模块来测量小段代码。

您也可以手动计时操作,记录操作前后的时间,然后计算差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多