如何在不修改用户代码的情况下超时使用 cProfiler 分析代码?

How to timeout code being profiled with cProfiler without modifying user code?

在我的工作中,我经常编写代码来从文件中读取行,然后一次处理这些行。

有时候行处理比较复杂,文件比较长,比如今天处理200行大概需要一分钟,文件一共175k行。

我想弄清楚我的代码的哪一部分花费了很长时间,为此我决定在 Python 中使用 cProfiler。

问题是我实际上不能 运行 整个代码,因为那会花费太长时间,而且如果我在退出信号中途中断​​进程,那么我的 cProfiler 也会在没有生成报告的情况下死掉,并且在某些只读前 K 行之后用逻辑修改代码以死是很烦人的(因为我在工作中对不同类型的数据倾向于这种事情。)我想避免添加选项只是为了分析如果可能。

告诉 cProfiler 运行 3 分钟、分析发生的情况、停止然后报告其发现的最简洁的方法是什么?

第 1 步:运行 您的脚本 myscript.py 在分析器下运行 3 分钟,将分析信息输出到文件 prof。在 Linux 和类似的平台上,您可以使用

timeout -s INT 3m python -m cProfile -o prof myscript.py

(注意:如果您省略 -s INT,则使用 SIGTERM 而不是 SIGINT,这似乎适用于 Python 2 但不适用于 Python 3。)或者,在任何系统,你应该可以做到

python -m cProfile -o prof myscript.py

然后在 3 分钟结束时按 Ctrl-C。

第 2 步:从 prof 文件中获取一些统计信息,例如

python -c "import pstats; pstats.Stats('prof').sort_stats('time').print_stats(20)"