作为信号处理任务的一部分,我对每个频率步长进行一些计算。
我有一个频率列表,长度为513。
我有一个3D numpy数组A,其形状为shape(81,81,513),其中513是频率点的数量,然后我有一个81x81的矩阵表示每个频率。
我想对每个矩阵做一些修改,得到A的修改版本,我在这里命名为B,它也是形状(81,81,513)。
为此,我开始预分配B:
B = np.zeros_like(A)
然后,我在频率上循环并调用一个dothing函数,如下所示:
for index, frequency in enumerate(frequencies):
B[:,:,index] = dothing(A[:,:,index])
问题是,dothing花费了大量时间,并且连续运行513个频率步长似乎无穷无尽。
所以我想把它并行化。但即使在阅读了大量文档和视频之后,我还是迷失在所有的库和潜在的解决方案中。所有单个频率的计算都可以独立完成。但最终我需要按照正确的顺序将所有内容分配回B。
你知道怎么做吗?
先谢了
安托万
1条答案
按热度按时间4zcjmb1e1#
这里我将使用一个使用
shared_memory
的共享数组,因为如果没有两个循环迭代使用相同的内存地址,就不需要保护写访问。我删除了第二个数组以缩短示例(只构建一个共享数组),并且我重新排序了数组形状以更好地保留内存对齐访问。multiprocessing.Pool
有时候在目标函数的有效参数方面有点滑稽,所以我倾向于通过池的初始化函数来共享Lock
、Queue
、shared_memory
等内容,该函数像Process
一样接受参数。