【发布时间】:2019-04-07 08:40:35
【问题描述】:
我真的很喜欢数据结构和算法。
我正在使用 80000 X 80000 矩阵来插入数据。我正在使用 numpy。而且,我的代码如下所示:
n = 80000
similarity = np.zeros((n, n), dtype='int8')
for i, photo_i in enumerate(photos):
for j, photo_j in enumerate(photos[i:]):
similarity[i, j] = score(photo_i, photo_j)
if i % 100 == 0:
print(i)
这段代码花费了太多时间。 score 函数为 O(1)。我想知道是否有更好的方法来做到这一点。我想在“短时间内”绘制这个矩阵的数据。但是我这样做的方式有 O(n^2) 的复杂度。
是否有“任何东西”,可以“优化”或使用不同的数据结构?
我已经阅读了关于 SO 的类似问题,并且他们提到了 pytables。我一定会尝试的,但还不知道如何。欢迎提出任何建议。
提前致谢。
【问题讨论】:
-
你可能会摆脱循环,你可能只使用上三角形(如果你的分数函数是对称的),但它的核心:它是一个二次任务,80k^2 是很多工作。
-
很可能时间花在了
score函数上,你没有显示出来;优化这可能会导致尝试优化循环代码的更好结果。如果你坚持,你可以用推导替换显式循环,或者去掉i % 100检查并打印进度。但与实际的评分逻辑相比,这些可能可以忽略不计。 -
@sascha,注意代码已经只计算了下三角(他们正在做
for j, photo_j in enumerate(photos[i:]))。 -
photos[i:]不是在每次调用该子数组时都创建一个新副本吗? -
您正在计算的矩阵的大小为 O(n^2),因此没有比这更好的方法了。问题是你真的需要整个矩阵吗?算法的下一步是什么?
标签: python python-3.x algorithm matrix data-structures