我需要将复杂的函数应用于长序列。顺便完成这似乎是低效的,因为我可以访问12核机器。
在对此进行大量投资之前,我写了这个比较pool.map和map的简单版本。
1)令人惊讶的是,地图要快得多(见下面的结果)。
2)池函数中存在溢出错误,该错误在地图版本中没有出现。
3)如果数组较小,则不会显示运行时警告,但地图仍然更快。
我不是一个计算机科学家(只是一个功能用户) - 任何想法和建议?我使用了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)
结果:
数量为cpus 12
游泳池时间2.40276007188
D:\ poolmap.py:19:运行时警告:在long_scalars中遇到溢出 Y = X * X
地图时间0.904187849745
############## UPDATE使用这个功能给了我正在寻找的结果
def func(x):
x=float(x)
y=(((x*x)**0.35))*x+np.ma.sqrt((((x*x)**0.35)))
return y
结果: cpus 12的数量
游泳池时间12.7410957475
地图时间45.4550067581