【问题标题】:cProfile and Python: Finding the specific line number that code spends most time oncProfile 和 Python:查找代码花费最多时间的特定行号
【发布时间】:2009-09-30 20:46:34
【问题描述】:

我正在使用 cProfile、pstats 和 Gprof2dot 来分析一个相当长的 Python 脚本。

结果告诉我,大部分时间都花在了调用我定义的对象中的方法上。但是,我真正想要的是确切地知道该函数中的哪个行号正在占用时间。

知道如何获取这些附加信息吗?

(顺便说一句,如果有帮助的话,我在 OSX 雪豹上使用 Python 2.6...)

【问题讨论】:

    标签: python scripting numbers profiler line


    【解决方案1】:

    在 python 中有一个 line profiler 由 Robert Kern 编写。

    【讨论】:

    • 这看起来确实像我正在寻找的东西......但是,我无法在 OSX Snow Leopard 上安装,因为它正在寻找 10.4 SDK(在 10.6 上不存在)。在构建脚本中也找不到参考来更改它...如果它有助于我在使用“sudo python setup.py install”时得到的确切错误消息是:使用似乎不存在的 SDK 进行编译: /Developer/SDKs/MacOSX10.4u.sdk
    • 我的 macbook 上没有这个问题(雪豹上也是如此)。我建议不要使用 sudo 进行安装,这通常是一个坏主意(它可能会破坏您的系统 python,并且 sudo 不会像您期望的那样导出您的环境变量)。我建议你把这个问题放到 enthought-dev 邮件列表中
    【解决方案2】:

    cProfile 不跟踪函数内的行号;它只跟踪定义函数的行号。

    cProfile 尝试复制profile 的行为(这是纯 Python)。 profile 使用 pstats 存储运行数据,pstats 仅存储函数定义的行号,而不存储单个 Python 语句。

    如果您需要更细致地了解您一直在吃什么,那么您需要将您的大函数重构为几个更小的函数。

    【讨论】:

    • 重构为小函数并不总是可行的——而且函数调用在 python 中很昂贵,这会显着影响速度。
    • +1:分解成更小的部分是最简单的方法。您还可以将一些块包装到本地定义的时间(用于分析)函数中。这甚至允许从不同的地方对同一函数进行单独的记帐调用。
    【解决方案3】:

    假设“消耗”的时间是某个数字,例如 40%。然后,如果您只是中断程序或在随机时间暂停它,那么您将看到它的概率是 40%,精确地暴露在调用堆栈上。这样做 10 次,在 4 个样本上,+/-,你会看到它。

    This tells why it works.This is an example.

    【讨论】:

      猜你喜欢
      • 2018-05-22
      • 2012-03-25
      • 2014-01-13
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多