Answers:
在CPython中,对这些数据类型调用len()是O(1),这是Python语言的最常见实现。这是指向表的链接,该表提供了CPython中许多不同函数的算法复杂性:
所有这些对象都保持其自身长度。提取长度的时间很小(大O表示形式为O(1)),并且主要由[粗略描述,用Python术语而不是C术语编写]:在字典中查找“ len”并将其分派给built_in len函数,它将查找对象的__len__
方法并调用...所有要做的就是return self.length
length
显示在词典中dir(list)
?
list.lenght
变量是用C实现的,而不是Python。
以下测量提供了len()
对于经常使用的数据结构为O(1)的证据。
关于的注释timeit
:当使用-s
标志并将两个字符串传递到timeit
第一个字符串时,仅执行一次,并且不计时。
$ python -m timeit -s "l = range(10);" "len(l)"
10000000 loops, best of 3: 0.0677 usec per loop
$ python -m timeit -s "l = range(1000000);" "len(l)"
10000000 loops, best of 3: 0.0688 usec per loop
$ python -m timeit -s "t = (1,)*10;" "len(t)"
10000000 loops, best of 3: 0.0712 usec per loop
$ python -m timeit -s "t = (1,)*1000000;" "len(t)"
10000000 loops, best of 3: 0.0699 usec per loop
$ python -m timeit -s "s = '1'*10;" "len(s)"
10000000 loops, best of 3: 0.0713 usec per loop
$ python -m timeit -s "s = '1'*1000000;" "len(s)"
10000000 loops, best of 3: 0.0686 usec per loop
$ python -mtimeit -s"d = {i:j for i,j in enumerate(range(10))};" "len(d)"
10000000 loops, best of 3: 0.0711 usec per loop
$ python -mtimeit -s"d = {i:j for i,j in enumerate(range(1000000))};" "len(d)"
10000000 loops, best of 3: 0.0727 usec per loop
$ python -mtimeit -s"import array;a=array.array('i',range(10));" "len(a)"
10000000 loops, best of 3: 0.0682 usec per loop
$ python -mtimeit -s"import array;a=array.array('i',range(1000000));" "len(a)"
10000000 loops, best of 3: 0.0753 usec per loop
$ python -mtimeit -s"s = {i for i in range(10)};" "len(s)"
10000000 loops, best of 3: 0.0754 usec per loop
$ python -mtimeit -s"s = {i for i in range(1000000)};" "len(s)"
10000000 loops, best of 3: 0.0713 usec per loop
$ python -mtimeit -s"from collections import deque;d=deque(range(10));" "len(d)"
100000000 loops, best of 3: 0.0163 usec per loop
$ python -mtimeit -s"from collections import deque;d=deque(range(1000000));" "len(d)"
100000000 loops, best of 3: 0.0163 usec per loop
len()
,并修复了测量值以正确使用该-s
标志。
python -m timeit -s "l = range(10000);" "len(l); len(l); len(l)"
每个循环223 ns,每个循环python -m timeit -s "l = range(100);" "len(l)"
66.2 ns
我一直在考虑Python中的len()取决于列表的大小,因此如果多次使用,我总是将长度存储在变量中。但是今天在调试时,我注意到列表对象中的__len__属性,因此len()必须只是在获取它,这使得复杂度为O(1)。所以我只是用谷歌搜索是否有人已经问过这个帖子。
__len__
是一个功能,而不是代表列表长度的变量。
list.__len__
函数在恒定时间内运行?它可以,但不仅仅是因为它是一个函数。因为它是那样实现的。