我惊讶地发现Python的bisect.bisect_left比NumPy的等价函数numpy.searchsorted更快。这是否与我使用的值的分布有关,还是对于任何输入都是如此?
>>> input_size = 10**3
>>> input_list = sorted([random.uniform(0, 300) for _ in range(input_size)])
>>> numpy_input = np.array(input_list)
>>> %timeit index = bisect.bisect_left(input_list, 100)
434 ns ± 6.17 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
>>> %timeit index = np.searchsorted(numpy_input, 100)
1.8 µs ± 21.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Python现在的版本是3.8.0,Numpy的版本是1.18.4。
bisect
是用C编写的,因此它没有纯Python实现所具有的字节码解释开销。(尽管它仍然需要执行每个元素的动态分派并跟随更多指针,因为它正在使用普通的Python列表。) - user2357112