我需要将一个复杂的函数应用于一个长系列。按顺序完成这似乎效率低下,因为我可以访问 12 核机器。
在对此进行大量投资之前,我编写了一个比较 pool.map 和 map 的简单版本。
1) 令人惊讶的是,地图要快得多(见下面的结果)。
2) 并且在地图版本上没有出现的池函数中存在溢出错误。
3) 使用较小的数组,不会出现运行时警告,但 map 仍然更快。
我不是计算机科学专家(只是一个功能用户) - 有什么想法和建议吗?我选择了 pool.map 因为异步版本可能会打乱系列的顺序(这对我来说很痛苦)。
请参阅下面的更新:基于 Jdog 的建议。
配置:python v 2.7,64位版本,windows 7
#-------------------------------------------------------------------------------
# Name: poolMap
#-------------------------------------------------------------------------------
import multiprocessing as mp
import numpy as np
import time
def func(x):
y=x*x
return y
def worker(inputs):
num=mp.cpu_count()
print 'num of cpus', num
pool = mp.Pool(num)
#inputs = list(inputs)
#print "inputs type",type(inputs)
results = pool.map(func, inputs)
pool.close()
pool.join()
return results
if __name__ == '__main__':
series = np.arange(500000)
start = time.clock()
poolAnswer = worker(series)
end = time.clock()
print 'pool time' ,(end - start)
start = time.clock()
answer = map(func,series)
end = time.clock()
print 'map time', (end - start)
结果:
cpu 数量 12
池时间 2.40276007188
D:\poolmap.py:19: RuntimeWarning: long_scalars y=x*x 中遇到溢出
地图时间 0.904187849745
##############更新使用这个函数给了我我正在寻找的结果
def func(x):
x=float(x)
y=(((x*x)**0.35))*x+np.ma.sqrt((((x*x)**0.35)))
return y
结果:CPU 数量 12
泳池时间 12.7410957475
地图时间 45.4550067581