我做了一个实验,我试图找到搜索python列表所需的时间。我有一个随机整数列表arr
。 arr_s
具有仅排序的相同元素。
arr = np.random.randint(low = 0, high = 1000, size = 500)
arr_s = sorted(arr)
现在我创建一个整数find
的随机数组,其中包含我想要在arr
和arr_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)整数的数组循环对于排序数组总是花费更长的时间。
答案 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
他们显然使用两种不同的迭代器来解释速度上的差异。