【发布时间】:2021-12-13 08:59:14
【问题描述】:
我有一个二维 NumPy 数组。每行都经过排序并包含少量元素(如 10),但有大量行(如 1e6)。它可能看起来像这样:
haystacks = [
[1, 4, 7, 8],
[2, 5, 5, 7],
[10, 11, 25, 30],
...
]
我也有一个一维数组。该数组的元素数与第一个数组的行数一样多。所以,也许:
needles = [10, 6, 15 ...]
我想对 2d 数组中相应行上的 1d 数组中的每个元素执行二进制搜索。我会使用np.searchsorted,但它似乎不支持这个用例。
我在物理系统的大型模拟中使用它。所以,性能非常重要。下面的代码可以运行,但是速度太慢了。
positions = []
for needle, haystack in zip(needles, haystacks):
positions.append(np.searchsorted(haystack, needle))
print(positions)
NumPy 解决方案是首选。其他库还可以,但我无法让 Numba 正常工作。
有人有什么想法吗?
【问题讨论】:
-
你试过分配内存给
positions吗?使用 NumPy 数组而不是列表来存储变量。应该会加快速度。 -
考虑到行有多小,在 Python 循环中使用广播 线性 搜索而不是二进制搜索可能会更快。
标签: python numpy performance