python - 如何使用多处理来加速以下功能?

标签 python python-3.x numpy python-multiprocessing

我有以下 for 循环:

for j in range(len(a_nested_list_of_ints)):
    arr_1_, arr_2_, arr_3_ = foo(a_nested_list_of_ints[j])
    arr_1[j,:] = arr_1_.data.numpy()
    arr_2[j,:] = arr_2_.data.numpy()
    arr_3[j,:] = arr_3_.data.numpy()

其中 a_nested_list_of_ints 是一个嵌套的整数列表。然而,它需要很多时间才能完成。如何通过多处理优化它?到目前为止,我尝试使用 multiprocessing

p = Pool(5)
for j in range(len(a_nested_list_of_ints)):
    arr_1_, arr_2_, arr_3_ = p.map(foo,a_nested_list_of_ints[j])
    arr_1[j,:] = arr_1_.data.numpy()
    arr_2[j,:] = arr_2_.data.numpy()
    arr_3[j,:] = arr_3_.data.numpy()

但是,我得到:

ValueError: not enough values to unpack (expected 3, got 2)

这里:

    arr_1_, arr_2_, arr_3_ = p.map(foo,a_nested_list_of_ints[j])

知道如何使上述操作更快吗?我什至还尝试过使用 starmap,但它无法正常工作。

最佳答案

这是一个有效的 pool 演示:

In [11]: def foo(i): 
    ...:     return np.arange(i), np.arange(10-i) 
    ...:                                                                        
In [12]: with multiprocessing.Pool(processes=2) as pool: 
    ...:     x = pool.map(foo, range(10)) 
    ...:                                                                        
In [13]: x                                                                      
Out[13]: 
[(array([], dtype=int64), array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])),
 (array([0]), array([0, 1, 2, 3, 4, 5, 6, 7, 8])),
 (array([0, 1]), array([0, 1, 2, 3, 4, 5, 6, 7])),
 (array([0, 1, 2]), array([0, 1, 2, 3, 4, 5, 6])),
 (array([0, 1, 2, 3]), array([0, 1, 2, 3, 4, 5])),
 (array([0, 1, 2, 3, 4]), array([0, 1, 2, 3, 4])),
 (array([0, 1, 2, 3, 4, 5]), array([0, 1, 2, 3])),
 (array([0, 1, 2, 3, 4, 5, 6]), array([0, 1, 2])),
 (array([0, 1, 2, 3, 4, 5, 6, 7]), array([0, 1])),
 (array([0, 1, 2, 3, 4, 5, 6, 7, 8]), array([0]))]

pool.map 正在执行迭代,而不是一些外部 for 循环。

为了更接近您的示例:

In [14]: def foo(alist): 
    ...:     return np.arange(*alist), np.zeros(alist,int) 
    ...:      
    ...:                                                                        
In [15]: alists=[(0,3),(1,4),(1,6,2)]                                           
In [16]: with multiprocessing.Pool(processes=2) as pool: 
    ...:     x = pool.map(foo, alists) 
    ...:                                                                        
In [17]: x                                                                      
Out[17]: 
[(array([0, 1, 2]), array([], shape=(0, 3), dtype=int64)),
 (array([1, 2, 3]), array([[0, 0, 0, 0]])),
 (array([1, 3, 5]), array([[[0, 0],
          [0, 0],
          [0, 0],
          [0, 0],
          [0, 0],
          [0, 0]]]))]

请注意,pool.map 返回一个列表,所有情况都从 alists 生成。解压那个 x 是没有意义的。

 x,y = pool.map(...)   # too many values to pack error

我可以使用 zip* 习惯用法解压 x:

In [21]: list(zip(*x))                                                          
Out[21]: 
[(array([0, 1, 2]), array([1, 2, 3]), array([1, 3, 5])),
 (array([], shape=(0, 3), dtype=int64), array([[0, 0, 0, 0]]), array([[[0, 0],
          [0, 0],
          [0, 0],
          [0, 0],
          [0, 0],
          [0, 0]]]))]

这是一个包含 2 个元组的列表;实际上是转置的列表版本。这可以解压:

In [23]: y,z = zip(*x)                                                          
In [24]: y                                                                      
Out[24]: (array([0, 1, 2]), array([1, 2, 3]), array([1, 3, 5]))
In [25]: z                                                                      
Out[25]: 
(array([], shape=(0, 3), dtype=int64), array([[0, 0, 0, 0]]), array([[[0, 0],
         [0, 0],
         [0, 0],
         [0, 0],
         [0, 0],
         [0, 0]]]))

关于python - 如何使用多处理来加速以下功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56157485/

相关文章:

python - Pandas read_csv 具有正确的标题,但列名称为 None

python - 我似乎无法让 Spark 上的 --py-files 工作

python - 如何使用 pandas 查找内存泄漏

numpy - 与 numpy.delete 相反

python - 没有内存分配的 numpy tile

python - 系统退出 : 2 error when calling parse_args() within ipython

python - 如何在Python中显示 "±"?

python - 在 flask 中打印多张图像(每行)

python - REST API POST 请求导致 AttributeError : 'bytes' object has no attribute 'items'

python - while-true 循环内的输入提示