如何配置我的代码?

时间:2010-06-15 13:27:07

标签: python profiling

我想知道如何分析我的代码。

我已经阅读了文档,但由于没有给出任何示例,我无法从中获得任何内容。

我有一个很大的代码,它花了很多时间,因此我想分析并提高它的速度。 我没有在方法中编写我的代码,其间很少但不完全。 我的代码中没有任何主要内容。我想知道如何使用分析。 我正在寻找关于如何分析的一些示例或示例代码。

我试过psyco,就是在我的代码顶部加了两行:

import psyco
psyco.full()

这是对的吗?它没有表现出任何改善。 任何其他加速方式,请建议。

3 个答案:

答案 0 :(得分:66)

此问题的标准答案是使用cProfile

你会发现没有将你的代码分成cProfile不会给你特别丰富的信息的方法

相反,您可能想尝试另一张海报在这里称为蒙特卡罗概况分析。引用another answer

  

如果你赶时间,你可以   手动中断您的程序   调试器正在进行中   主观上很慢,有一个简单的   找到性能问题的方法。

     

暂停几次,每次   时间看看调用堆栈。 如果有的话   是一些浪费一些的代码   时间的百分比,20%或50%或   无论如何,这就是概率   你会在每个人的行为中抓住它   样本。这大致是   您的样本百分比   会看到它。没有受过教育   需要猜测。如果你有   猜测问题是什么,这个   将证明或反驳它。

     

您可能有多种表现   不同大小的问题。如果你   清除他们中的任何一个,   剩下的将会更大   百分比,更容易发现   随后的通行证。

     警告:程序员往往是   对此技术持怀疑态度,除非   他们自己用过它。他们会的   说分析器给你这个   信息,但只有这样才有效   他们对整个调用堆栈进行采样。   调用图表不会给你相同的   信息,因为1)他们没有   总结在教学水平,   2)他们给出了令人困惑的摘要   在递归的情况下。他们   也会说它只适用于玩具   程序,实际上它的工作原理   任何程序,它似乎工作   对更大的节目更好,因为   他们往往会遇到更多问题   找到[强调添加]。

这不是正统的,但我在一个项目中非常成功地使用它,在这个项目中,使用cProfile进行分析并没有给我提供有用的输出。

关于它的最好的事情是,在Python中这很容易做到。只需在解释器中运行Python脚本,按[Control-C],记下回溯并重复多次。

答案 1 :(得分:18)

编辑:

此答案已在https://github.com/campos-ddc/cprofile_graph

中实施

使用cProfile进行概要分析

这是我前段时间写的一篇关于使用cProfile进行概要分析和一些图形辅助的文章。

cProfile是最常用的python剖析器之一,虽然非常强大,但标准文本输出有点乏味。在这里,我将向您展示如何以更简单的方式在您的应用程序中使用cProfile。

使用cProfile有两种常用方法,您可以将其用作提示中的命令来分析给定模块,或者您可以在代码中使用它来分析特定的代码片段。

分析模块

要使用cProfile配置整个模块,只需在提示中使用以下命令:

python -m cProfile -o output_filename.pstats path/to/script arg1 arg2

这将使用给定的参数运行您的模块(它们是可选的)并将输出转储到output_filename.pstats中。

lots of ways来读取该输出文件中的数据,但为了这篇文章的目的,让我们不要担心这些并专注于获取图形可视化。

从内部分析

有时您不想分析整个模块,只需几行。

为此,您需要在模块中添加一些代码。

首先:

import cProfile

然后,您可以使用以下代码替换任何代码段:

cProfile.runctx('Your code here', globals(), locals(), 'output_file')

例如,这是分析前后的测试:

import unittest

class Test(unittest.TestCase):

    def testSomething(self):
        self.DoSomethingIDontCareAbout()

        param = 'whatever'
        self.RunFunctionIThinkIsSlow(param)

        self.AssertSomeStuff() # This is after all, a test

后:

import unittest
import cProfile

class Test(unittest.TestCase):

    def testSomething(self):
        self.DoSomethingIDontCareAbout()

        param = 'whatever'
        cProfile.runctx(
            'self.RunFunctionIThinkIsSlow(param)',
            globals(),
            locals(),
            'myProfilingFile.pstats'
        )

        self.AssertSomeStuff() # This is after all, a test

将pstats文件转换为图形

要将性能分析文件转换为图形,您需要做一些事情:

  • gprof2dot:此模块会将您的输出转换为文件,这是图形描述的标准文件格式。
  • GraphViz:它会将您的文件转换为图像。

下载 gprof2dot 并安装 GraphViz 后,在提示符下运行此命令:

python gprof2dot -f pstats myProfileFile | dot -Tpng -o image_output.png

您可能必须使用 gprof2dot 和/或 dot 的完整路径,或者您可以将它们添加到PATH env变量中。

在完成所有这些之后,你应该有一个看起来像这样的图像:

results example

  • 较热的颜色(红色,橙色,黄色)表示比较冷颜色(绿色,蓝色)占用总运行时间的功能

  • 在每个节点上,您可以看到该函数使用的总运行时间的百分比以及调用它的次数。

  • 节点之间的箭头表示哪个函数称为其他函数,此类箭头还有一个标题,指示运行时的百分比。

注意:百分比总是不能总计达到100%,特别是在引用C ++代码的代码部分上,这些部分不会被分析。 cProfile也无法确定从“eval”语句中调用的内容,因此您可能会在图表中看到一些跳转。

答案 2 :(得分:6)

使用cProfile。您可以从命令行使用它并将模块作为参数传入,因此您不需要main方法。