Python 3:如何在范围对象中查找比在列表中查找更快?

imp*_*rme 5 python lookup list xrange python-3.x

当我遇到在对象中查找的答案之一range是 CONSTANT TIME 操作时,我在 StackOverflow 上滚动浏览了许多与列表与范围相关的问题!这在 O(1) 中如何完成是没有意义的,您将不得不遍历范围以查看是否存在数字。范围对象是否像一些哈希图/字典一样工作?

def usingRange(x):
    return x in range(0, 100000000)
print(usingRange(9999999)) 


def noRange(x):
    return x in list(range(0, 100000000))
print(noRange(9999999))

%timeit usingRange(9999999)
%timeit noRange(9999999)
Run Code Online (Sandbox Code Playgroud)

我得到的输出为:

True
True
443 ns ± 8.83 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
6.89 s ± 380 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Run Code Online (Sandbox Code Playgroud)

我想知道为什么它的时间恒定的原因是因为

  1. 有人告诉我不要太专注于学习 Python 编程面试中的“技巧”!因为你所做的每一件事,你都必须解释时间复杂度,所以你要么记住i in list1O(N),要么使用 for 循环遍历列表:

    for j in range(len(list1)):
        if list1[j] == i:
            print(True)
    
    else:
        print(False)
    
    Run Code Online (Sandbox Code Playgroud)

然后得出结论,它实际上是 O(N),因为要检查元素是否存在,您必须遍历列表的每个元素,直到列表末尾(最坏的情况)。但是一些恒定时间操作似乎不太明显!我可以接受哈希表中的循环是 O(1) 的事实,因为有一个名为 Hashing 的大概念(尚未详细介绍),但不确定它如何用于range对象。

  1. 有人告诉我,了解基础知识至关重要!并尽最大努力解释你所写的每一行以及你为什么在白板上写它。我认识的某个人确实被要求为一家非常著名的科技公司的 SWE 职位实施 HASHMAP。

  2. 我有很多时间(1 年)来准备和好奇。