Python对块中的数组进行多处理并将结果添加到共享数组

我处理2个大型一维数组(分别说A和B):我对A和B元素对进行运算,并将结果写入共享数组C(将C视为直方图)。我想使用 multiprocessing 来并行化进程。我认为最佳方法可能是将数组A切片成与我选择要执行的并行进程数量相等的唯一块,然后使用 for 循环对B的所有元素进行数学运算。 / p>

我正在阅读许多问题/答案。我以使用{em> Process 的示例Multiprocessing a loop of a function that writes to an array in python为例。我试图适应我的问题,但是却获得了串行执行的性能。我正在测试的代码

from multiprocessing import Process,Lock
from multiprocessing.sharedctypes import Array
import numpy as np
import time


def ProcessData(sub_data1,data2,freq):
    for dat1 in sub_data1:
        for dat2 in data2:
            d = int( np.sqrt( (dat1 - dat2)**2 ) )
            #d = int(dat1 - dat2)
            if (d < len(freq)):
                freq[d] += 1

def SplitList(data,n):
    sub_len = divmod(len(data),n)[0]
    print(sub_len)
    slices = []
    for i in range(n):
        slices.append( data[i*sub_len:i*sub_len+sub_len] )
    return slices
    
def main(nproc):
    print("Number of cpu : ",mp.cpu_count())
    lock = Lock()
    N = 30
    chip = [1,1,2,3,4,5,6,7,8,9,9]
    data1 = np.array( chip * N )
    data2 = np.array( chip * N )
    freq = Array('i',100,lock=lock)
    dat1_subs = SplitList(data1,nproc)
    print('Number of data1 slices {:d}'.format(len(dat1_subs)))
    t_start = time.time()
    
    if __name__ == '__main__':
        for i in range(0,nproc):
            print('LEN {:d}: {:d}'.format(i,len(dat1_subs[i] )) )
            p = Process(target=ProcessData,args=(dat1_subs[i],freq))
            p.start()
            p.join()

    t_end =  time.time()
    print('Total time (s)= ' + str(t_end - t_start))
    print(str(list(freq)))
    #new_array = np.frombuffer(freq.get_obj())
    Sum = sum( list(freq) )
    print('Total {:d}'.format(Sum))
    
NProc = 4

main(NProc)

我会很感激任何输入或暗示我做错了什么。也许还有我不知道的更简单的方法。 谢谢。

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...