python pool.map vs map

时间:2012-05-30 13:52:22

标签: python map multiprocessing pool

我需要将复杂的函数应用于长序列。顺便完成这似乎是低效的,因为我可以访问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

0 个答案:

没有答案