2014-12-03 42 views
0

基本上,来自不同模块的进口越多,包括这些多处理任务所花费的时间越长,即使没有使用任何模块功能。每个进程都需要重新导入一切或什么?到底是怎么回事?为什么导入在多处理中有成本?

import time 

time1 = time.time() 

import multiprocessing as mp 
import numpy as np # Random imports (not used) 
import PIL 
import PySide 
import pandas 
# print time.time() - time1 # here this prints 0.0 

class Multi(object): 
    def __init__(self, queue): 
     self.q = queue  
    def run(self, a): 
     p = mp.Process(target=f, args=(a, q)) 
     p.start() 
     print self.q.get() 
     p.join() 


class MultiPool(object): 
    def __init__(self, N): 
     self.N = N 
     self.pool = mp.Pool(processes = self.N)  
    def run(self): 
     result = self.pool.map_async(f1, ((i,) for i in range(self.N))) 
     print result.get() 


def f(a, q): 
    for i in range(10000000): 
     b = i 
    q.put(b) 

def f1(a): 
    for i in range(10000000): 
     b = i 
    return b 

if __name__ == '__main__': 

    q = mp.Queue() 
    e = Multi(q) 

    # time1 = time.time() 
    print f1(0) 
    print time.time() - time1 

    time1 = time.time() 
    e.run('123') 
    print time.time() - time1 

    time1 = time.time() 
    mpool = MultiPool(2) 
    mpool.run() 
    print time.time() - time1 

# Output with random imports: 
>9999999 
>0.246000051498 
>9999999 
>0.693000078201 
>[9999999, 9999999] 
>0.720999956131 

# Output without imports: 
>9999999 
>0.246000051498 
>9999999 
>0.315999984741 
>[9999999, 9999999] 
>0.313999891281 
+0

请发布您的脚本的输出 – 2014-12-03 11:19:14

+0

你会如何删除导入?你如何获得第二个输出? – 2014-12-03 12:19:00

+0

只是将未使用的进口注释掉。我输入的进口越多,多处理输出的时间越长 – kezzos 2014-12-03 12:19:25

回答

1

multiprocessing必须在任何理线进口一切都只是因为有过程(新应用程序),而不是线程。

您将通过脚本测量的是执行方法的成本加上过程创建的成本。您可以测量进口成本,并且它们正好在import报表所在的位置执行。

+0

第一次time.time()块不显示额外导入的损失。在执行函数之前是否设置了__main__的导入? – kezzos 2014-12-03 11:13:33

+0

@kezzos是真正的难题。现在我在平板电脑上。稍后我会尝试一下 – 2014-12-03 12:36:28

相关问题