pythonpool.map与map
我需要对一个长序列应用一个复函数。按顺序完成这似乎是低效的,因为我有一个12核的机器 在对此进行重大投资之前,我编写了一个简单的版本,比较pool.map和map 1) 令人惊讶的是,map速度要快得多(见下面的结果) 2) 池函数中有一个溢出错误,映射版本中没有出现该错误 3) 对于较小的阵列,运行时警告不会出现,但映射速度更快 我不是一个计算机科学的家伙(只是一个功能用户)-有什么想法和建议吗?我使用pool.map是因为异步版本可能会打乱系列的顺序(这对我来说是一个很难解决的问题) 请参阅下面的更新:基于Jdog的建议 配置:Pythonv2.7,64位版本,Windows7pythonpool.map与map,python,map,multiprocessing,pool,Python,Map,Multiprocessing,Pool,我需要对一个长序列应用一个复函数。按顺序完成这似乎是低效的,因为我有一个12核的机器 在对此进行重大投资之前,我编写了一个简单的版本,比较pool.map和map 1) 令人惊讶的是,map速度要快得多(见下面的结果) 2) 池函数中有一个溢出错误,映射版本中没有出现该错误 3) 对于较小的阵列,运行时警告不会出现,但映射速度更快 我不是一个计算机科学的家伙(只是一个功能用户)-有什么想法和建议吗?我使用pool.map是因为异步版本可能会打乱系列的顺序(这对我来说是一个很难解决的问题) 请参阅
#-------------------------------------------------------------------------------
# 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:在长\u标量中遇到溢出
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也没有计算机科学家,但也许如此短的时间间隔是在
池中播放的。地图
必须设置所有内容。让func
更密集一点,然后再试一次。我没有让函数更复杂,只是将arange增加到2000万,结果更令人伤心:CPU 12池时间的数量84.3208359572映射时间6.6808615689 numexpr时间0.0632046093354Jdog-谢谢-加入一个更丑陋的函数极大地改变了性能。有趣的是,仅仅使用numpy数组来计算series*series是最快的。看起来在更基本的阵列操作中进行了一些认真的优化。multiply(series,series)比原始的pool或map函数快得多。我想知道为什么<代码>多处理。池增加了大量开销,因为进程正在启动,并且在它们之间发送数据。当您进行繁重的计算时,它最有用,而不是像平方运算这样的琐碎计算。至于NumPy,它的速度很快,因为它不必像Python那样做所有的类型检查。顺便说一句,使用正确的选项构建的NumPy可以在内部执行多线程处理,因此这里介绍了如何利用多核处理器。例如,看一看。