使用 PyCharm(或任何其他 IDE)分析 python 程序

Profiling a python program with PyCharm (or any other IDE)

我是运行一个比较复杂的python程序,里面有一个蒙特卡洛模拟,占用了大部分时间。我想找出它的哪一部分使用了最多的资源,以便我可以让它更快。

我正在使用 PyCharm 专业版并尝试使用分析器,但结果只是一大堆我从未听说过的无关功能。

问题:是否有我可以使用的好的分析器提供有意义的结果,以便我可以看到哪个函数或关键字在我的 montecarlo 模拟中使用了最多的资源?

根据您的需要和您的 python 版本,也许您想使用 hotshot 之类的东西。 https://docs.python.org/2/library/hotshot.html

编辑:

对于 python 3.4 cProfile 可能是您可用的最佳选项之一,但您肯定必须使用 grep/sed/awk 过滤结果才能获得相关结果,尤其是如果您使用库在发生大量内部调用的地方导入。

我喜欢按通话次数排序: python -m cProfile -s 'calls' <your_program>.py

现在 python3 中关于该方法的问题是如果从外部调用 cProfile 将显示原始调用的数量,因此 运行 在内部可能是一个更好的主意:

import cProfile

pr = cProfile.Profile()
pr.enable()
your_function_call()
pr.disable()
# after your program ends
pr.print_stats(sort="calls")

注意:如评论中所述,以下内容适用于PyCharm的付费版本:

如果使用 3.x(不知道 2.x),我将添加到 shafeen 的答案中,并根据原始 post 使其更 PyCharm 具体].这也适用于 Web 应用程序或更大的应用程序,而不是简单的命令行程序,在这些程序中将输出打印到标准输出可能没问题(能够通过 PyCharm 的查看器对不同的方式进行排序更好)。

的确,按照建议通过实例化配置文件并根据需要启用和禁用来执行。不过,要使其有用,您需要将其保存到文件中。

  • 在代码的外部部分,实例化配置文件。
  • 在代码的内部部分,进行分析。
  • 现在,调用 pr.dump_stats('profile.pstat')

您现在有一个要检查的配置文件。转到工具|打开 CProfile 快照。 Select profile.pstat 现在您可以根据需要按不同的标题查看和排序。

总结

import cProfile as profile

# In outer section of code
pr = profile.Profile()
pr.disable()

# In section you want to profile
pr.enable()
# code of interest
pr.disable()

# Back in outer section of code
pr.dump_stats('profile.pstat')

在 PyCharm 的 CProfile 查看器中打开文件。

我很惊讶还没有人提到 SnakeViz。除了来自 Spyder 的分析器之外,这是迄今为止我能找到的最好的 python 分析器:

pip install snakeviz

然后:

python -m cProfile -o program.prof my_program.py
snakeviz program.prof

它将在您的浏览器中打开一些漂亮的可视化效果: