如何在并行python进程中优化导入

时间:2018-03-27 20:31:12

标签: python python-3.x import

让我们说我有一个处理文本json的python程序。使用multiprocessing.Pool,我将咀嚼数十万个json文件;这通常需要几天时间。

我有两个脚本。有一个master.py脚本可以生成进程。生成的进程运行外部程序,并通过subprocess.run将结果传递给另一个python脚本。

otherProgram {args} | pipe.py {more args}

master.py不会直接产生pipe.py进程;这是由OS调用完成的,所以我导入master.py' are not shared with the imports required by pipe.py`。

在48节点机器上,我最多并行运行了44个线程(即multiprocessing.Pool(44, maxtaskperchild = 10))。

所以我有两个关于导入过程的相关问题:

  • 有没有办法主要导入标准库,并且一个带有一些辅助函数的自定义模块会以一种我可能会注意到的方式对性能产生负面影响?

  • 如果有,有没有办法优化pipe.py流程的导入?不是导入osbinascii以及tarfile数十万次,有没有办法让同一组导入可用于多个进程?

1 个答案:

答案 0 :(得分:0)

我使用可执行脚本(import_stuff.py)对此进行了测试,该脚本与相关pipe.py的导入相同。

import subprocess, multiprocessing, datetime

def proc():
   subprocess.run(['/path/to/import_stuff.py', shell = True])
then = datetime.datetime.now()

for _ in range(1000):
   p.appy_async(proc)

p.close()
p.join()

delta = datetime.datetime.now() - then
print(delta)
  • 1000次迭代:0:00:00.665622
  • 10000次迭代:0:00:05.981406
  • 100000次迭代:0:01:10.125345

由于我的程序的100,000次迭代需要数小时才能运行,因此重复导入内容的开销并不是很大。