python - numpy.searchsorted 的性能在结构化数组上很差

标签 python arrays numpy binary-search

如果我误用了任何条款,请提前道歉,请随时更正。

我有一个排序数组 dtype '<f16, |S30' .当我使用 searchsorted在它的第一个领域,它的工作速度非常慢(300 万个项目大约需要 0.4 秒)。这比 bisect 长得多需要在元组的普通 Python 列表上执行相同的操作。

%timeit a['f0'].searchsorted(400.)
1 loops, best of 3: 398 ms per loop

但是,如果我将浮点部分复制到另一个单独的数组,搜索速度会比 bisect 快:

b = a['f0'].copy()

%timeit b.searchsorted(400.)
1000000 loops, best of 3: 945 ns per loop

我的问题是:

  1. 是我做错了什么还是 NumPy 的回归?
  2. 有没有办法在不重复数据的情况下避免这种情况?

最佳答案

我记得前段时间看到过这个。如果我没记错的话,我认为 searchsorted 在数据不连续时会临时复制数据。如果我稍后有时间,我会查看代码以确认发生了什么(或者更熟悉代码的人可以确认这一点)。

与此同时,如果您不想重组代码以避免使用结构化数组,最好的选择可能是使用 bisect_left(a['f0'], 400.)。在我的机器上,它比连续数组上的搜索排序慢 8 倍,但比非连续数组上的搜索排序快 1000 倍。

In [5]: a = np.arange((6e6)).view([('f0', float), ('f1', float)])

In [6]: timeit a['f0'].searchsorted(400.)
10 loops, best of 3: 51.1 ms per loop

In [7]: timeit a['f0'].copy()
10 loops, best of 3: 51 ms per loop

In [8]: timeit bisect_left(a['f0'], 400.)
10000 loops, best of 3: 52.8 us per loop

In [9]: f0 = a['f0'].copy()

In [10]: timeit f0.searchsorted(400.)
100000 loops, best of 3: 7.85 us per loop

关于python - numpy.searchsorted 的性能在结构化数组上很差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15139299/

相关文章:

python - 无法使用pip安装pyaudio

javascript - 如何保存所有页面的输入值并允许用户在页面重新加载时查看更改?

python - 从 URL 录制和识别音乐

python - 如何沿第一维在两个 3D 张量之间执行矩阵乘法?

python - Numpy - 数组中行和列的自定义排序

python - 如何使用新时间戳重写文件中的某些行

python - csvkit:对于 csv 到 Table,当

python - 更改嵌套列表中一个索引的值 (Python)

PHP:如何根据其中一个内部数组的值对包含内部数组的数组进行排序?

c - 如何制作动态int数组