我想知道如何分析我的代码。
我已经阅读了文档,但由于没有给出任何示例,我无法从中获得任何内容。
我有一个很大的代码,它花了很多时间,因此我想分析并提高它的速度。 我没有在方法中编写我的代码,其间很少但不完全。 我的代码中没有任何主要内容。我想知道如何使用分析。 我正在寻找关于如何分析的一些示例或示例代码。
我试过psyco,就是在我的代码顶部加了两行:
import psyco
psyco.full()
这是对的吗?它没有表现出任何改善。 任何其他加速方式,请建议。
答案 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是最常用的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
要将性能分析文件转换为图形,您需要做一些事情:
下载 gprof2dot 并安装 GraphViz 后,在提示符下运行此命令:
python gprof2dot -f pstats myProfileFile | dot -Tpng -o image_output.png
您可能必须使用 gprof2dot 和/或 dot 的完整路径,或者您可以将它们添加到PATH env变量中。
在完成所有这些之后,你应该有一个看起来像这样的图像:
较热的颜色(红色,橙色,黄色)表示比较冷颜色(绿色,蓝色)占用总运行时间的功能
在每个节点上,您可以看到该函数使用的总运行时间的百分比以及调用它的次数。
节点之间的箭头表示哪个函数称为其他函数,此类箭头还有一个标题,指示运行时的百分比。
注意:百分比总是不能总计达到100%,特别是在引用C ++代码的代码部分上,这些部分不会被分析。 cProfile也无法确定从“eval”语句中调用的内容,因此您可能会在图表中看到一些跳转。
答案 2 :(得分:6)
使用cProfile。您可以从命令行使用它并将模块作为参数传入,因此您不需要main
方法。