繁体   English   中英

c配置需要很长时间

[英]cProfile taking a very long time

我开始使用cProfile来配置我的python脚本。 我注意到一些非常奇怪的事情。

当我用time测量脚本的运行时间时需要4.3秒。

当我使用python -m cProfile script.py时需要7.3秒。

在代码中运行探查器时:

import profile
profile.run('main()')

需要63秒!!

我可以理解为什么在添加分析时可能需要多一点时间,但为什么在外部使用cProfile或作为代码的一部分之间存在这样的差异? 当我使用profile.run时,为什么需要这么多时间?

奇怪的是,你所看到的是预期的行为。 在Python文档的概要分析部分的介绍中 ,它指出与cProfile相比, profile增加了“分析程序的显着开销”。 你看到的差异在于你正在使用的库,而不是你如何调用它们。 考虑这个脚本:

import profile
import cProfile

def nothing():
    return

def main():
    for i in xrange(1000):
        for j in xrange(1000):
            nothing()

    return

cProfile.run('main()')
profile.run('main()')

cProfile的输出显示main运行大约需要0.143秒,而profile变量报告1.645秒,这是~11.5倍。

现在让我们再次将脚本更改为:

def nothing():
    return

def main():
    for i in xrange(1000):
        for j in xrange(1000):
            nothing()

    return

if __name__ == "__main__":
    main()

并使用分析器调用它:

python -m profile test_script.py

报告主要运行1.662秒。

python -m cProfile test_script.py

报告主要运行0.143秒。

这表明启动分析器的方式与您在cProfileprofile之间看到的差异cProfile 差异是由两个分析器如何处理“事件”(如函数调用或返回)引起的。 在这两种情况下,执行代码中都有软件挂钩,触发回调以跟踪这些事件,并执行更新事件计数器以及启动或停止计时器等操作。 但是, profile模块在Python中原生处理所有这些事件,这意味着您的解释器必须保留代码,执行回调内容,然后返回继续使用代码。

使用cProfile (执行分析回调) cProfile发生同样的事情,但它更快,因为回调是用C语言编写的。看看两个模块文件profile.pycProfile.py演示了一些差异:

  1. profile.py是610行,而cProfile.py只有199行 - 它的大部分功能都是用C语言处理的。
  2. profile.py主要使用Python库,而cProfile.py导入“_lsprof”,一个C代码文件。 来源可以在这里查看。
  3. profile.py中的Profile类不继承自任何其他类(第111行),而cProfile.py (第66行)中的Profile类继承自_lsprof.Profiler ,后者在C源文件中实现。

正如文档所述, cProfile通常是要走的路,因为它主要是用C实现的,所以一切都更快。

另外,您可以通过校准来提高profile的性能。 文档提供了有关如何执行此操作的详细信息有关如何/为何所有这些内容的更多详细信息,请参阅有关确定性分析限制的Python文档部分。

TL; DR

cProfile要快得多,因为顾名思义,它的大部分是用C实现的。这与profile模块形成对比,后者必须处理本机Python中的所有分析回调。 无论是从命令行调用分析器还是在脚本中手动调用,都不会影响两个模块之间的时差。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM