并行更新阵列?



假设我有一个python列表:

def func(arr, i):
arr[i] = arr[i] + ' hello!'
xyz = ['a','b','c','d','e']
for i in range(len(xyz)):
func(xyz, i)
for i in xyz:
print i

并最终

a hello!
b hello!
c hello!
d hello!
e hello!

由于我的列表非常大,如何使用多核并行更新列表的元素?

我搜索了所有地方,似乎找不到答案。

多亏了@roganjosh的建议,我才能够找到答案:

import numpy as np
from multiprocessing import Pool
arr = ['a','b','c','d','e','f','g']
def edit_array(i):
return arr[i] + ' hello!'
if __name__=='__main__':
pool = Pool(processes=4)
list_start_vals = range(len(arr))
array_2D = pool.map(edit_array, list_start_vals)
pool.close()
print array_2D

这里有一个相对简单的方法,使用multiprocessing模块来做到这一点:

import functools
import multiprocessing
def func(arr, i):
arr[i] = arr[i] + ' hello!'
if __name__ == '__main__':
manager = multiprocessing.Manager()  # Create a manager to handle shared object(s).
xyz = manager.list(['a','b','c','d','e'])  # Create a proxy for the shared list object.
p = multiprocessing.Pool(processes=4)  # Create a pool of worker processes.
# Create a single arg function with the first positional argument (arr) supplied.
# (This is necessary because Pool.map() only works with functions of one argument.)
mono_arg_func = functools.partial(func, xyz)
p.map(mono_arg_func, range(len(xyz)))  # Run func in parallel until finished
for i in xyz:
print(i)

输出:

a hello!
b hello!
c hello!
d hello!
e hello!

请注意,如果列表很大,这不会很快,因为共享对大型对象的访问需要在单独的任务(在不同的内存空间中运行(之间产生大量开销。

更好的方法是使用根据文档"使用管道和一些锁/信号量"实现的multiprocessing.Queue(而不是共享列表对象,其全部内容必须多次酸洗和取消酸洗(。

从您想要用新值替换列表中项目的当前值的问题中得到:

for position, value in enumerate(xyz):
xyz[position] = '%s hello!' % value

给: ['a hello!', 'b hello!', 'c hello!', 'd hello!', 'e hello!']

相关内容

  • 没有找到相关文章

最新更新