假设我有一个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!']