Python 如何分析我的代码?
我想知道如何分析我的代码 我已经看了这些文件,但由于没有给出任何例子,我无法从中得到任何信息 我有一个大的代码,这是需要这么多时间,因此我想概况和提高其速度。 我还没有用方法编写代码,中间很少,但不是完全。 我的代码中没有任何主代码。我想知道如何使用分析。 我正在寻找一些关于如何配置文件的示例或示例代码 我尝试了psyco,即在代码顶部添加了两行:Python 如何分析我的代码?,python,profiling,Python,Profiling,我想知道如何分析我的代码 我已经看了这些文件,但由于没有给出任何例子,我无法从中得到任何信息 我有一个大的代码,这是需要这么多时间,因此我想概况和提高其速度。 我还没有用方法编写代码,中间很少,但不是完全。 我的代码中没有任何主代码。我想知道如何使用分析。 我正在寻找一些关于如何配置文件的示例或示例代码 我尝试了psyco,即在代码顶部添加了两行: import psyco psyco.full() 是这样吗?没有任何改善。 任何其他加速方式,请建议。使用。您可以从命令行使用它并将其作为参数传
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文件转换为图形
要将分析文件转换为图形,需要做以下几件事:
- :此模块将您的输出转换为点文件,这是图形描述的标准文件格式
- :它将您的点文件转换为图像
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并不总是意味着提高表现