最近我一直在尝试并行化一些列表理解以加快代码速度,但我发现并行化会导致执行时间变差。。。有人能帮我理解为什么吗?
我的电脑是一台i7 4核8线程,核心速度约为3GHz,我使用的是python 2.7
这里有一个我的代码示例:
import numpy as np
import multiprocessing as mulpro
import itertools
d1 = 0.1;
d2 = 0.2;
data = range(100000) #Array of data
#example of list comprehension
data2 = [i + np.random.uniform(d1,d2) for i in data] #this is faster than the following
#example of multiprocessing
def parAddRandom(array):
array = list(array)
return (array[0] + np.random.uniform(array[1],array[2]))
pool = mulpro.Pool(processes=8)
data3 = pool.map(parAddRandom, itertools.izip(data, itertools.repeat(d1), itertools.repeat(d2)))
我希望通过并行化,代码会更快,因为除了1个内核外,还使用了8个内核,但这并不是。。。
编辑:
如果我修改代码,使函数parAddRandom只接受一个值,那么它会非常快。。。
import numpy as np
import multiprocessing as mulpro
import itertools
data = range(100000) #Array of data
#example of list comprehension
data2 = [i + np.random.uniform(d1,d2) for i in data] #Now this is not faster than the following
#example of multiprocessing
def parAddRandom(value):
return (value + np.random.uniform(0.1,0.2))
pool = mulpro.Pool(processes=8)
data3 = pool.map(parAddRandom, data)
但我仍然需要能够修改参数";d1";以及";d2";从上一个代码。。。
因为函数很小,所以函数调用(和其他多处理机制)的开销占主导地位)
import numpy as np
import timeit
d1 = 0.1;
d2 = 0.2;
def parAddRandom(array):
return (array[0] + np.random.uniform(array[1],array[2]))
array = 45436, d1, d2
with_function_calling = timeit.timeit("parAddRandom(array)", globals=globals())
without_function_calling = timeit.timeit("array[0] + np.random.uniform(array[1],array[2])", globals=globals())
print ("function call adds {:0.2f}% overhead :(".format((100.0*with_function_calling/without_function_calling) - 100.0))
函数单独调用会增加18.59%的开销:(
我的猜测是,在你的例子中,其他多处理机制几乎增加了100%。。。
如果你想让它有效,你必须创建一个每次占用更大块的函数。