为什么我在numpy.searchsorted结束左等分在日期时间列表上?

2024-10-01 17:28:33 发布

您现在位置:Python中文网/ 问答频道 /正文

比python的二进制搜索快。纽比需要更多的准备。在

我用的是数字阵列的数字时间64物体。这个性能测试类似于我的用例——为一个目标搜索大约1000个日期时间的列表。在

from bisect import bisect_left
from datetime import datetime, timedelta
from random import randrange
from timeit import timeit

import numpy as np


def randdate():
    r = randrange(int((datetime.max - datetime.min).total_seconds()))
    return datetime.min + timedelta(seconds=r)


data = sorted(randdate() for _ in xrange(1000))
np_data = np.array(data, dtype=np.datetime64)

x = randdate()
np_x = np.datetime64(x)


def python_bisect():
    result = bisect_left(data, x)
    return result


def numpy_searchsorted():
    result = np_data.searchsorted(np_x)
    return result


time1 = timeit(python_bisect, number=1000)
time2 = timeit(numpy_searchsorted, number=1000)
print time1
print time2
print "bisect/searchsorted: {}".format(time1 / time2)

不过,我看到的对分速度是searchsorted的两倍。在


Tags: fromimportnumpydatadatetimereturndefnp
1条回答
网友
1楼 · 发布于 2024-10-01 17:28:33

基准测试的一些问题:

  1. 应该对输入列表/数组进行排序。在
  2. Python级别for循环中的单个操作不是NumPy性能的良好度量:np.searchsorted的第二个参数支持数组。使用此功能。在
  3. 使用更多的输入,例如10**6而不是20000。在
  4. 使用timeit进行可靠的性能测量。在

下面是一个演示:

N = 10**6

data = sorted([randdate() for _ in range(N)])
np_data = np.sort(np.array(data, dtype=np.datetime64).astype(np.int64))

def python_bisect():
    return [bisect(data, data[x]) for x in range(N)]

def numpy_searchsorted():
    return np.searchsorted(np_data, np_data, side='right')

%timeit python_bisect()       # 1.3 s per loop
%timeit numpy_searchsorted()  # 60 ms per loop

相关问题 更多 >

    热门问题