Python 如何分析我的代码?

Python 如何分析我的代码?,python,profiling,Python,Profiling,我想知道如何分析我的代码 我已经看了这些文件,但由于没有给出任何例子,我无法从中得到任何信息 我有一个大的代码,这是需要这么多时间,因此我想概况和提高其速度。 我还没有用方法编写代码,中间很少,但不是完全。 我的代码中没有任何主代码。我想知道如何使用分析。 我正在寻找一些关于如何配置文件的示例或示例代码 我尝试了psyco,即在代码顶部添加了两行: import psyco psyco.full() 是这样吗?没有任何改善。 任何其他加速方式,请建议。使用。您可以从命令行使用它并将其作为参数传

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

我已经看了这些文件,但由于没有给出任何例子,我无法从中得到任何信息

我有一个大的代码,这是需要这么多时间,因此我想概况和提高其速度。 我还没有用方法编写代码,中间很少,但不是完全。 我的代码中没有任何主代码。我想知道如何使用分析。 我正在寻找一些关于如何配置文件的示例或示例代码

我尝试了psyco,即在代码顶部添加了两行:

import psyco
psyco.full()
是这样吗?没有任何改善。
任何其他加速方式,请建议。

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

此问题的标准答案是使用

您会发现,如果不将代码分成方法,cProfile就不会给您提供特别丰富的信息

相反,您可能想试试这里的另一张海报所称的蒙特卡罗评测。引自:

如果你赶时间,你可以 在以下情况下手动中断程序 调试器正在运行时被禁用 主观上缓慢,有一个简单的 查找性能问题的方法

停几次,每次 时间来看看调用堆栈如果有 有些代码是在浪费时间 时间百分比,20%或50%或 不管怎样,这就是 你会在每一场比赛中都抓住它 示例。因此,这大致是 您所使用的样本的百分比 我会看到的。没有受过教育的人 需要猜测。如果你有 猜猜问题是什么,这个 将证明或反驳它

您可能有多个性能 不同规模的问题。如果你 把他们中的任何一个清理干净 剩下的要花更大的时间 百分比,并且更容易发现 随后的通行证

警告:程序员倾向于 怀疑这种技术,除非 他们自己也用过。他们将 假设分析人员给了你这个 信息,但只有在 他们对整个调用堆栈进行采样。 调用图不会给出相同的结果 信息,因为1)他们没有 在教学层面进行总结, 2)他们给出了令人困惑的摘要 在存在递归的情况下。他们 也会说它只对玩具有效 程序,当它实际工作时 任何程序,它似乎都能工作 更大的项目更好,因为 他们往往有更多的问题要解决 查找[添加重点]

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

最好的一点是,这在Python中非常容易实现。只需在解释器中运行Python脚本,按[Control-C],记下回溯并重复多次。

Edit: 这一答案已在中国实施

用cProfile进行剖面分析 这是我不久前写的一篇文章,内容是关于使用cProfile和一些图形辅助工具进行评测

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

使用cProfile有两种常见的方法,您可以将它用作提示符中的命令来评测给定模块,也可以在代码中使用它评测特定的代码片段

分析模块 要使用cProfile评测整个模块,只需在提示符中使用以下命令:

python -m cProfile -o output_filename.pstats path/to/script arg1 arg2
python gprof2dot -f pstats myProfileFile | dot -Tpng -o image_output.png
这将使用给定的参数(可选)运行模块,并将输出转储到output_filename.pstats中

有很多方法可以读取输出文件上的数据,但就本文而言,我们不必担心这些问题,而只需关注图形可视化

从内部剖析 有时,您不想分析整个模块,只需分析其中的几行

为此,您必须向模块中添加一些代码

首先:

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后,在提示符下运行此命令:

python -m cProfile -o output_filename.pstats path/to/script arg1 arg2
python gprof2dot -f pstats myProfileFile | dot -Tpng -o image_output.png
您可能必须为gprof2dot和/或dot使用完整路径,或者您可以将它们添加到path env变量中

在所有这些之后,你应该有一个像这样的图像:

  • 较热的颜色(红色、橙色、黄色)表示比较冷的颜色(绿色、蓝色)占用更多运行时间的函数

  • 在每个节点上,您都可以看到该函数在总运行时中所占的百分比以及调用次数

  • 节点之间的箭头指示调用其他函数的函数,这些箭头还有一个标题,指示运行时的百分比


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

“但无法成功”意味着什么。提供您使用的具体代码和错误。请具体一点。请能有人谁使用分析器,早些时候帮助我!!psyco并不总是意味着提高表现