【问题标题】:How to timeout code being profiled with cProfiler without modifying user code?如何在不修改用户代码的情况下超时使用 cProfiler 分析代码?
【发布时间】:2016-03-10 21:36:38
【问题描述】:

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

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

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

问题是我实际上无法运行整个代码,因为那会花费太长时间,如果我在退出信号中途中断​​进程,那么我的 cProfiler 也会死掉,而不会生成报告并使用逻辑修改代码以死经过一定的阅读后,仅前 K 行很烦人(因为我在工作中经常针对不同类型的数据进行这种事情。)如果可能的话,我想避免仅为了分析而添加选项。

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

【问题讨论】:

  • 您不能从文件中取出几行并创建第二行,以便对其进行分析并找到处理代码中的瓶颈吗?
  • 是的,这完全有可能,但如果文件实际上不是 CSV 文件而是更复杂的文件(如 XML 或 json),通常会很麻烦。此外,我只是在编写一些研究代码,因此文件名在一些地方是硬编码的,我必须使其更加模块化,仅出于分析的目的。基本上我想尽可能避免改变。
  • 你试过this method吗?

标签: python profiling cprofile


【解决方案1】:

第 1 步:在 profiler 下运行你的脚本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)"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多