将线路分析器与多处理一起使用

时间:2018-10-11 10:14:32

标签: python profiling python-multiprocessing line-profiler

您如何配置使用多重处理(multiprocessing.Pool.map)的python模块,以便每个生成的进程也逐行进行配置。

当前,我使用line_profiler进行性能分析,但它不支持多处理。 有手动方法吗?或者也许使用其他工具?

1 个答案:

答案 0 :(得分:0)

推荐的使用 line_profiler 的方法是将 @profile 添加到被分析的函数,然后运行 ​​kernprof -v -l script.py。将它与多处理模块一起使用时,这会导致如下错误:

Can't pickle <class '__main__.Worker'>: attribute lookup Worker on __main__ failed.

要解决此问题,我们必须在要分析的子流程中自行设置 line_profiler,而不是通过 kernelprof 全局设置。

举个例子,假设我们想要分析我们的一个工作进程的 run 方法。这是设置:

import multiprocessing as mp
import line_profiler

class Worker(mp.Process):

    def run(self):
        prof = line_profiler.LineProfiler()
        # Wrap all functions that you want to be profiled in this process
        # These can be global functions or any class methods
        # Make sure to replace instance methods on a class level, not the bound methods self.run2
        Worker.run2 = prof(Worker.run2)
        ...
        # run the main
        self.run2()
        # store stats in separate file for each process
        prof.dump_stats('worker.lprof')

    def run2(self):
        # real run method renamed
        ...

现在运行脚本会生成一个配置文件,然后我们可以使用该文件进行可视化:

python -m line_profiler worker.lprof