【发布时间】:2022-01-07 10:45:21
【问题描述】:
我的代码有以下目标:
1.) 给定 2 个 numpy 数组 a1 和 a2(仅由 0,1 组成)在 a1 和 a2 中找到 0 的索引位置。
2.) 查找数组 a1 和 a2 之间的匹配索引位置(如果有)
3.) 计算指标
a1 数组形状 = 2161
a2 数组形状 = 2161
例如
a1 = [0,1,1,0,1,0,1]
a2 = [1,1,0,0,1,1,0]
a1 中 0 的索引 = idx_a1[0,3,5]
a2 中 0 的索引 = idx_a2[2,3,6]
常见的 0 索引 b/w a1 和 a2 = 3
function_1 执行 step1 和 step2 和 step3
function1_iterations 在随机打乱 a1 并重复度量计算 1000 次后重复 function_1。这是为了确定指标是否具有统计意义。
我在 1 亿个数组对上执行以下代码,在 256 个内核上进行多处理。 1 亿个数组对的最佳运行时间约为 40 分钟。有什么办法可以显着提高效率吗?我需要在数十亿个数组对上运行它。
我下面的代码是我能从之前的 codereview 中得到一些帮助的最快的代码:
def function_1(self,a1, a2):
event_index1, = np.where(a1 == 0)
event_index2, = np.where(a2 == 0)
n1, = event_index1.shape
n2, = event_index2.shape
if n1 == 0 or n2 == 0:
return 0, 0
n_matches, = np.intersect1d(event_index1, event_index2, assume_unique=True,).shape
c_ij = n_matches/2
metric_1= (c_ij *2) / math.sqrt(n1 * n2)
return metric_1
def function1_iterations(self,a1,a2,repeat = 1000,original_metric1):
list_metric1 = []
a1_copy = copy.deepcopy(a1)
for i in range(0,repeat):
np.random.shuffle(a1_copy) # shuffle bits in array and recalculate 1000 times
metric_1 = self.function_1(a1= a1_copy, a2 = a2)
list_metric1.append(metric_1)
list_metric1= np.array(list_metric1)
significance_val = len(np.where(list_metric1>= [original_metric1])[0])/repeat
return significance_val
【问题讨论】:
-
您应该确定代码的哪一部分最慢并简化您的问题以尝试首先优化该部分
-
等等,你在设置
c_ij = c_ji = n_matches/2,然后只使用c_ij和c_ji来计算c_ij + c_ji?为什么要这么做? (这不是瓶颈,但很奇怪。) -
@mozway 我应该为此逐行分析代码吗?我用timeit来测试代码sn-p的性能
-
如果您的目标是优化以在大型数据集上运行,那么可能