【问题标题】:Python Profile PitfallsPython 配置文件陷阱
【发布时间】:2011-10-02 01:43:24
【问题描述】:

我是一个刚开始分析我的代码的初学者,我很困惑为什么 cProfile 给出的经过时间与使用 time.time() 给出的时间相差如此之大。

# Python 2.7.2

import cProfile

def f(n):
    G = (i for i in xrange(n))
    sum = 0
    for i in G:
        sum += i

num = 10**6

cProfile.run('f(num)')

这给了 1000004 次函数调用在 2.648 秒内

但是使用 time.time(),我得到 0.218000173569 秒

import time

x = time.time()
f(num)
print time.time() - x

根据我的阅读,我猜这可能是因为 cProfile 的开销。对于 cProfile 计时可能非常偏离的情况,或获得更准确计时的方法,是否有任何一般提示?

【问题讨论】:

    标签: python profile benchmarking


    【解决方案1】:

    请注意,cProfile 为您提供CPU time,但使用 time.time() 为您提供经过的时间(这不是您想要的)。

    也许你可以尝试使用 unix time 程序。

    ➜  sandbox  /usr/bin/time -p python profiler.py
    
    real         0.17
    user         0.14
    sys          0.01
    

    CPU时间应该是user+sys

    【讨论】:

      【解决方案2】:

      分析的目的是找出程序的哪些部分花费的时间最多,因此最需要关注。如果一个函数使用了 90% 的时间,那么您应该在那里查看如何使该函数更有效。整个运行需要 10 秒还是 1000 秒都没有关系。

      也许探查器为您提供的最重要的信息是调用了多少次。为什么这很有用,它可以帮助您找到经常不必要地调用事物的地方,特别是如果您有嵌套循环或许多调用其他函数的函数。探查器可帮助您追踪这些东西。

      分析开销是不可避免的,而且很大。但是让分析器完成它的工作要比在各处插入您自己的计时和打印语句要容易得多。

      【讨论】:

      • “如果 90% 的时间都被一个函数使用......”——我主要担心的不是确切的时间,而是相对时间。我可以想象一些看起来占用了 90% 的时间的东西实际上占用了 1% 的时间。我知道其中涉及复杂性,但我想知道是否有有用的启发式方法,例如“由于 [某种原因],[某些] 类型的操作通常会在分析器中延长时间”。
      • @rallen:获取所花费时间的百分比(而不是绝对时间)正是我试图提出的观点。当你使用分析器时,你不应该依赖于绝对时间,而是依赖于被分析的各种组件的列出时间之间的关系。请注意,通常,人们使用分析器来检查比您的示例更复杂的函数。
      • @rallen:至于复杂性弄乱了探查器数据,从而隐藏了真正的瓶颈,或者快速部分看起来像瓶颈:我认为您在任何情况下都不会遇到这种情况可能会写。我不能说它永远不会发生,但这不是我有理由担心的事情。如果你碰巧遇到了一些似乎以令人难以置信或难以置信的可疑方式描述的东西,那么将 that 作为 Stack Overflow 或 comp.lang.python 问题提出。 ;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      相关资源
      最近更新 更多