簡體   English   中英

Python多處理和共享numpy數組

[英]Python multiprocessing and shared numpy array

我有一個問題,類似於:

import numpy as np

C = np.zeros((100,10))

for i in range(10):
    C_sub = get_sub_matrix_C(i, other_args) # shape 10x10
    C[i*10:(i+1)*10,:10] = C_sub

因此,顯然不需要將其作為連續計算運行,因為每個子矩陣可以獨立計算。 我想使用多處理模塊並為for循環創建最多4個進程。 我閱讀了一些關於多處理的教程,但是無法弄清楚如何使用它來解決我的問題。

謝謝你的幫助

並行化該代碼的一種簡單方法是使用進程Pool

pool = multiprocessing.Pool()
results = pool.starmap(get_sub_matrix_C, ((i, other_args) for i in range(10)))

for i, res in enumerate(results):
    C[i*10:(i+1)*10,:10] = res

我使用了starmap因為get_sub_matrix_C函數有多個參數( starmap(f, [(x1, ..., xN)])調用f(x1, ..., xN) )。

但請注意,序列化/反序列化可能會占用大量時間和空間 ,因此您可能必須使用更低級別的解決方案來避免此開銷。


看起來你正在運行一個過時的python版本。 您可以使用普通map替換starmap ,但是您必須提供一個帶有單個參數的函數:

def f(args):
    return get_sub_matrix_C(*args)

pool = multiprocessing.Pool()
results = pool.map(f, ((i, other_args) for i in range(10)))

for i, res in enumerate(results):
    C[i*10:(i+1)*10,:10] = res

以下配方也許可以完成這項工作。 隨意問。

import numpy as np
import multiprocessing

def processParallel():

    def own_process(i, other_args, out_queue):
        C_sub = get_sub_matrix_C(i, other_args)
        out_queue.put(C_sub)            

    sub_matrices_list = []
    out_queue = multiprocessing.Queue()
    other_args = 0
    for i in range(10):
        p = multiprocessing.Process(
                            target=own_process,
                            args=(i, other_args, out_queue))
        procs.append(p)
        p.start()

    for i in range(10):
        sub_matrices_list.extend(out_queue.get())

    for p in procs:
        p.join()

    return sub_matrices_list    

C = np.zeros((100,10))

result = processParallel()

for i in range(10):
    C[i*10:(i+1)*10,:10] = result[i]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM