基本上,我必须从5000个矩阵的样本中取样,以获得一定的概率分布。所以我只需要计算元素X在这5000个矩阵的(I,j)位置出现的次数。然后,我将这些[值和计数]保存在字典中
也就是说,我认为并行化我的代码可能是个好主意,因为串行代码的运行速度会非常慢。 代码如下:
import multiprocessing as mp
import numpy as np
def func(N):
d = {}
filenames = ["file" + str(k) + ".txt" for k in range(N, N + 1000)]
##each of these files is a 306x306 matrix
for i in range(306):
data = np.vstack([np.loadtxt(f, delimiter=",", usecols=i) for f in filenames])
for j in range(306):
values, counts = np.unique(data.T[j], return_counts=True)
for i in values:
d[i] = counts[np.where(values == i)]
return d
if __name__ == "__main__":
N = mp.cpu_count()
with mp.Pool(processes=N) as p:
results = p.map(func, [m for m in range(1000, 5000, 1000)])
因为这是我第一次并行化一个函数,我想得到一些反馈。此外,由于它必须加载一个1000x306矩阵,因此速度仍然很慢,因此任何关于如何改进它的建议都是非常受欢迎的
根据这一描述:
我将重新构造您的代码,以返回306x306字典数组,其中包含该位置出现的每个值的键,以及该值出现多少次的值。然后,您可以并行生成文件子集的数据,然后在最后合并数据。您应该调整
chunksize
以一次加载多个文件(尽可能多的内存),以减少手动循环数组索引的次数。在访问arr[:,i,j]
时,将数据重新排序为“Fortran”顺序应该会使数组访问更高效(对np.unique
的调用会更快)相关问题 更多 >
编程相关推荐