Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pythonpool.map与map_Python_Map_Multiprocessing_Pool - Fatal编程技术网

pythonpool.map与map

pythonpool.map与map,python,map,multiprocessing,pool,Python,Map,Multiprocessing,Pool,我需要对一个长序列应用一个复函数。按顺序完成这似乎是低效的,因为我有一个12核的机器 在对此进行重大投资之前,我编写了一个简单的版本,比较pool.map和map 1) 令人惊讶的是,map速度要快得多(见下面的结果) 2) 池函数中有一个溢出错误,映射版本中没有出现该错误 3) 对于较小的阵列,运行时警告不会出现,但映射速度更快 我不是一个计算机科学的家伙(只是一个功能用户)-有什么想法和建议吗?我使用pool.map是因为异步版本可能会打乱系列的顺序(这对我来说是一个很难解决的问题) 请参阅

我需要对一个长序列应用一个复函数。按顺序完成这似乎是低效的,因为我有一个12核的机器

在对此进行重大投资之前,我编写了一个简单的版本,比较pool.map和map

1) 令人惊讶的是,map速度要快得多(见下面的结果)

2) 池函数中有一个溢出错误,映射版本中没有出现该错误

3) 对于较小的阵列,运行时警告不会出现,但映射速度更快

我不是一个计算机科学的家伙(只是一个功能用户)-有什么想法和建议吗?我使用pool.map是因为异步版本可能会打乱系列的顺序(这对我来说是一个很难解决的问题)

请参阅下面的更新:基于Jdog的建议

配置:Pythonv2.7,64位版本,Windows7

#-------------------------------------------------------------------------------
# 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可以在内部执行多线程处理,因此这里介绍了如何利用多核处理器。例如,看一看。