首页 > 解决方案 > 使用 NumPy 数组(或创建元组)的索引性能瓶颈

问题描述

想象一下,我们有以下功能:

def return_slice(self, k):
    return (self.A[self.C[k]:self.C[k+1]], self.B[self.C[k]:self.C[k+1]])

它是具有数组 A、B 和 C 的类的一部分,其中包含大量整数(超过 10^5)。虽然调用这个函数几次就足够快了,但我注意到对这个函数的大约 200 万次调用需要很长时间(我最近的几次经验显示大约 12 秒)。我设法在这方面做得更好:

def return_slice(self, k):
    pos = slice(self.C[k], self.C[k + 1])
    return (self.A[pos], self.B[pos])

这将其降低到约 6 秒。这对我来说仍然有点不可接受......我觉得我应该改变我的数组的整个结构方式,但我把这个问题带给你,因为我可能会错过一些东西为什么这么慢.

请记住,不能假设 k 值的“结构”,只需假设每次执行都是随机的。

我还认为在返回之前创建元组可能是这里的问题,但要消除它需要大量的工作——我更愿意探索其他替代方案。

编辑:A 和 B 的大小相同,但数据类型不同。

标签: pythonperformancenumpy

解决方案


怎么样?

 self.D = np.vstack(self.A, self.B)

 def return_slice(self, k):
     pos = slice(self.C[k], self.C[k + 1])
     return tuple(self.D[:, pos])

推荐阅读