【发布时间】:2021-11-06 19:23:07
【问题描述】:
我有以下(采样的)字典 A,它最初有超过 17,000 个键,每个数组的长度刚刚超过 600,000(对所有人来说都是一样的)。我试图为 600,000 个输入中的每一个找到数组中最小数字的键。例如,在下面的字典中,我想得到 i = 3093094 for j = 0 因为 45.16672136 是所有数组的第一个索引中最小的。同样,对于 j = 1,i = 1157086 因为 1.53174068 是最小的。
A = {3093094: array([45.16672136, 1.68053313, 13.78822307, ..., 36.18798239,
36.09565274, 35.85261821]),
1156659: array([45.46286695, 1.69632425, 13.81351489, ..., 36.54544469,
36.45329774, 36.20969689]),
1156667: array([45.43970605, 1.69026244, 13.81365067, ..., 36.51934187,
36.42716964, 36.18364528]),
1156792: array([45.29956347, 1.57736575, 13.90834355, ..., 36.43079348,
36.33804273, 36.09623309]),
1157086: array([45.38149498, 1.53174068, 13.98398836, ..., 36.57985343,
36.48684657, 36.2457831 ]),
1430072: array([45.46114909, 1.58096885, 13.95459557, ..., 36.64775128,
36.55496457, 36.31324461]),
1668445: array([45.44073352, 1.5941793 , 13.92953699, ..., 36.60630965,
36.51361336, 36.27162926]),
3055958: array([45.45006118, 1.57686417, 13.95499241, ..., 36.63558996,
36.54278917, 36.30111176]),
1078241: array([45.56175847, 1.77256163, 13.75586274, ..., 36.61441986,
36.52264105, 36.27795081])}
我有以下多处理解决方案方法,但由于处理时间太长,正在寻找更有效的方法。
import numpy as np
import os
from multiprocessing import Pool
C = range(len(A[3093094]))
def closest(All_inputs):
(A,j) = All_inputs
B = list(A.keys())
my_list = [A[i][j] for i in B]
return(B[np.argmin(np.array(my_list))])
with Pool(processes=os.cpu_count()) as pool:
results = pool.map(closest, [(A,j) for j in C])
一个挑战是在多处理中复制 A,因为它的大小很大。你有什么 Pythonic 方法可以快速完成这个看似微不足道的计算吗?
【问题讨论】:
-
也许你可以把你的字典切成块?之后你可以在线程中使用这个块
-
在我的经验中,对字典进行切片是最耗时的部分。我认为,
my_list = [A[i][j] for i in B]正在做切片。如果我在多处理之前进行切片,那么我会以串行方式进行大部分计算。否则,我复制一个巨大的字典... -
第二个想法:你能对你的输入进行排序吗?你有一个 [key][0] - 始终是数组的最小值
-
然后,我丢失了每个数组中的顺序,不知道是否将 A[key][0] 与 A[another_key][0] 进行比较。我也看不出它有什么帮助。我不是试图找到每个键的最小值的数组索引。
标签: python arrays numpy multiprocessing