3

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

4

0 回答 0