为什么在python中的排序列表中搜索需要更长时间?

时间:2013-09-05 18:42:28

标签: python list sorting search

我做了一个实验,我试图找到搜索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)整数的数组循环对于排序数组总是花费更长的时间。

3 个答案:

答案 0 :(得分:7)

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一起使用可能不是一个好主意。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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



    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

他们显然使用两种不同的迭代器来解释速度上的差异。