Python 使用具有多处理功能的测线仪

Python 使用具有多处理功能的测线仪,python,profiling,python-multiprocessing,line-profiler,Python,Profiling,Python Multiprocessing,Line Profiler,如何分析使用多处理(multiprocessing.Pool.map)的python模块,以便对每个生成的进程进行逐行分析 目前我使用line_profiler进行分析,但它不支持多处理。 有没有办法手动完成?或者使用其他工具?您可以这样使用 从内存\u分析器导入配置文件 将多处理作为mp导入 导入时间、psutil、gc、操作系统 @外形(精度=4) def阵列_操作(数量): gc.collect() 尺寸1=10**num 尺寸2=20**(数量+1) x=[1]*尺寸1 y=[2]*大小

如何分析使用多处理(multiprocessing.Pool.map)的python模块,以便对每个生成的进程进行逐行分析

目前我使用line_profiler进行分析,但它不支持多处理。 有没有办法手动完成?或者使用其他工具?

您可以这样使用

从内存\u分析器导入配置文件
将多处理作为mp导入
导入时间、psutil、gc、操作系统
@外形(精度=4)
def阵列_操作(数量):
gc.collect()
尺寸1=10**num
尺寸2=20**(数量+1)
x=[1]*尺寸1
y=[2]*大小2
y*=2
德利
gc.collect()
z=x*2
gc.collect()
返回x
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
工人数量=3
pool=mp.pool(工人数量)
图(数组操作[4,5,6])
pool.close()
pool.join()
这是一个示例输出

Line#Mem用法增量行内容
================================================
6 34.4258 MiB 34.4258 MiB@剖面(精度=4)
7 def阵列操作(数量):
8 34.4258 MiB 0.0000 MiB gc.collect()
9 34.4258 MiB 0.0000 MiB大小1=10**num
10 34.4258 MiB 0.0000 MiB大小2=20**(num+1)
11 34.5586 MiB 0.1328 MiB x=[1]*尺寸1
12 58.7852 MiB 24.2266 MiB y=[2]*大小2
13 83.2539 MiB 24.4688 MiB y*=2
14 34.6055 MiB 0.0000 MiB del y
15 34.6055 MiB 0.0000 MiB gc.collect()
16 34.6055 MiB 0.0000 MiB z=x*2
17 34.6055 MiB 0.0000 MiB gc.collect()
18 34.6055 MiB 0.0000 MiB返回x
文件名:array_ops.py
行#内存使用增量行内容
================================================
6 34.4258 MiB 34.4258 MiB@剖面(精度=4)
7 def阵列操作(数量):
8 34.4258 MiB 0.0000 MiB gc.collect()
9 34.4258 MiB 0.0000 MiB大小1=10**num
10 34.4258 MiB 0.0000 MiB大小2=20**(num+1)
11 35.0820 MiB 0.6562 MiB x=[1]*size1
12523.3711 MiB 488.2891 MiB y=[2]*大小2
13 1011.6172 MiB 488.2461 MiB y*=2
14 35.2969 MiB 0.0000 MiB del y
15 35.2969 MiB 0.0000 MiB gc.collect()
16 36.5703 MiB 1.2734 MiB z=x*2
17 36.5703 MiB 0.0000 MiB gc.收集()
18 36.8242 MiB 0.2539 MiB返回x
文件名:array_ops.py
行#内存使用增量行内容
================================================
6 34.4258 MiB 34.4258 MiB@剖面(精度=4)
7 def阵列操作(数量):
8 34.4258 MiB 0.0000 MiB gc.collect()
9 34.4258 MiB 0.0000 MiB大小1=10**num
10 34.4258 MiB 0.0000 MiB大小2=20**(num+1)
11 42.0391 MiB 7.6133 MiB x=[1]*尺寸1
12 9807.7109 MiB 9765.6719 MiB y=[2]*大小2
13 19573.2109 MiB 9765.5000 MiB y*=2
14 42.1641 MiB 0.0000 MiB del y
15 42.1641 MiB 0.0000 MiB gc.collect()
16 57.3594 MiB 15.1953 MiB z=x*2
17 57.3594 MiB 0.0000 MiB gc.收集()
18 57.3594 MiB 0.0000 MiB返回x

建议使用ist将
@profile
添加到要分析的函数中,然后运行
kernprof-v-l script.py
。但是,当将其与多处理模块一起使用时,会导致以下错误:

无法pickle:main上的属性查找工作程序失败。
要解决这个问题,我们必须在我们想要评测的子流程中自己设置
line\u profiler
,而不是通过
kernelprof
全局设置

例如,让我们假设我们想要分析一个辅助进程的
run
方法。以下是设置:

将多处理导入为mp
导入测线分析器
类工作者(mp.Process):
def运行(自):
prof=line_profiler.LineProfiler()
#包装在此过程中要分析的所有函数
#这些可以是全局函数或任何类方法
#确保在类级别替换实例方法,而不是绑定方法self.run2
Worker.run2=prof(Worker.run2)
...
#主营
self.run2()
#将每个进程的统计数据存储在单独的文件中
dump_教授统计数据(“worker.lprof”)
def run2(自我):
#实数运行方法重命名
...
现在,运行脚本将生成一个配置文件,我们可以使用该文件可视化:

python -m line_profiler worker.lprof