Python:并行修改数组的简单方法

标签 python arrays parallel-processing

这个问题听起来很简单,但作为 Python 并行化的新手,我肯定很吃力。我在 C++ 的 OpenMP 中处理并行化,这要容易得多。 我需要做的是并行修改矩阵的条目。就是这样。问题是,我无法使用简单的 joblib 库来做到这一点:

from joblib import Parallel, delayed

my_array = [[ 1 ,2 ,3],[4,5,6]]

def foo(array,x):
  for i in [0,1,2]:
     array[x][i]=2
  return 0

def main(array):
  inputs = [0,1]
  if __name__ == '__main__':
    Parallel(n_jobs=2, verbose = 0)(delayed(foo)(array,i) for i in inputs)

main(my_array)

这段代码在作业数为1时有效(因此调用main后的数组全为2),但当它真正成为真正的多处理时就不行了(调用main后数组保持不变) ). 我认为主要的问题是我无法返回任何对 Parallel 函数有用的东西。我还尝试将数组放在共享内存中,但我找不到任何关于如何使用 joblib 进行操作的信息。

有什么建议吗?

最佳答案

仅使用标准库,您可以使用共享内存,在本例中为 Array 来存储和修改您的数组:

from multiprocessing import Pool, Array, Lock

lock = Lock()

my_array = [Array('i', [1, 2, 3], lock=lock),
            Array('i', [4, 5, 6], lock=lock),]

让我建议您对您的程序进行一些修改:列出您需要对矩阵进行的所有更改的列表或时间表(为了清楚起见,我将使用 namedtuple) ,以及映射这些变化的函数。

Change = namedtuple('Change', 'row idx value')

scheduled_changes = [Change(0, 0, 2),
                     Change(0, 1, 2),
                     Change(1, 0 ,2),
                     Change(1, 1, 2)]
# or build the scheduled changes list in any other way like using 
# for loops or list comprehensions...

def modify(change, matrix=my_array):
    matrix[change.row][change.idx] = change.value

现在您可以使用 Pool 将修改函数映射到更改:

pool = Pool(4)
pool.map(modify, scheduled_changes)

for row in my_array:
    for col in row:
        print(col, end=' ')
    print()

# 2 2 3
# 2 2 6

关于Python:并行修改数组的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38936296/

相关文章:

python - flask-oauthlib 服务器不能很好地与 requests-oauthlib 客户端配合使用

python - Python 是否有一种方法可以在不显式分配计数器变量的情况下重复给定的次数?

c - 数组声明,C

C++使用单独的函数按降序对数组进行排序

c - 错误结果私有(private)数组 openmp

c - 使用 OpenMP 进行矩阵相乘比序列化方式花费更多时间

sql - 这种方法可以扩展 SQL 查询吗?

Python:AND 评估的优化

python - 从第二个 DF 中快速(矢量化)查找属于相同大小的矩形(由两个点给出)的一个 DF 中的点

python - 按 x、y 和多个 z 存储点