【问题标题】:Why search in sorted list in python takes longer?为什么在 python 中的排序列表中搜索需要更长的时间?
【发布时间】:2013-09-09 17:17:18
【问题描述】:

我做了一个实验,试图找出搜索 python 列表所需的时间。我有一个带有随机整数的列表arrarr_s 仅对相同的元素进行了排序。

arr = np.random.randint(low = 0, high = 1000, size = 500)
arr_s = sorted(arr)

现在我创建一个随机整数数组find,其中包含我想要在arrarr_s 中搜索的元素。

>>> %%timeit
...:find = np.random.randint(0, 1000, 600)
...:for i in find:
...:    if i in arr:
...:        continue

[OUT]:100 loops, best of 3: 2.18 ms per loop


>>> %%timeit
...:find = np.random.randint(0, 1000, 600)
...:for i in find:
...:    if i in arr_s:
...:        continue

[OUT]:100 loops, best of 3: 5.15 ms per loop

现在我了解到我没有使用任何特定方法在排序数组中进行搜索(例如二进制搜索)。所以它可能正在执行标准的线性搜索,但为什么在排序数组中搜索比在未排序数组中搜索要花费更长的时间?我认为它应该花费几乎相同的时间。我尝试了各种find 数组。具有 (0, 1000)、(-1000, -100) 和 (-10000, 10000) 整数的数组,对于排序后的数组,循环总是需要更长的时间。

【问题讨论】:

标签: python list sorting search


【解决方案1】:

Python 列表与 C 数组不同。它们不仅仅是一个简单的内存块,其中元素 1 总是在元素 0 之后,依此类推。相反,Python 以一种灵活的方式存储内容,以便您可以添加和删除任意类型的元素并随意移动内容。

在这种情况下,我的猜测是对列表进行排序的行为会改变底层组织,从而降低访问元素的效率。

【讨论】:

    【解决方案2】:
    arr = np.random.randint(low = 0, high = 1000, size = 500)
    arr_s = sorted(arr)
    

    arr 是一个数组。 arr_s 是一个列表。 numpy 可以有效地处理搜索数组,但搜索列表需要跟随指针并执行类型检查。它与排序无关。

    注意:in does weird things in numpy.in 与 numpy ndarray 一起使用可能不是一个好主意。

    【讨论】:

    • 我将数组转换为列表。现在它们都需要相同的时间。
    • 这个答案是正确的。不幸的是,Python 列表……效率很低。 :\
    • 遍历 numpy 数组非常慢,因为 numpy 必须在访问数组元素时为它们创建包装对象。这是在使用 ndarray 时应始终使用矢量化操作而不是循环的众多原因之一。
    【解决方案3】:

    我没有确切的答案,但一个可能的起点是检查每个对象使用的迭代器。

    
    
        In [9]: it = arr.__iter__()
        In [10]: its = arr_s.__iter__()
        In [11]: type(it)
        Out[11]: iterator
        In [12]: type(its)
        Out[12]: listiterator
    
    

    他们显然使用了两种不同的迭代器,这可以解释速度上的差异。

    【讨论】:

      猜你喜欢
      • 2018-06-11
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      相关资源
      最近更新 更多