len()函数的成本

时间:2009-07-12 04:31:03

标签: python algorithm collections complexity-theory

Python内置函数的len()函数的成本是多少? (列表/元组/串/字典)

6 个答案:

答案 0 :(得分:265)

O(1)(恒定时间,不依赖于元素的实际长度 - 非常快)对于您提到的每种类型,加上set和其他类似{ {1}}。

答案 1 :(得分:131)

对这些数据类型调用len()是CPython中的O(1),这是Python语言最常见的实现。这是一个表的链接,它提供了CPython中许多不同函数的算法复杂性:

TimeComplexity Python Wiki Page

答案 2 :(得分:63)

以下测量结果为经常使用的数据结构提供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

字典(字典理解在2.7 +中可用):

$ 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

设置(设置理解在2.7 +中可用):

$ 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

的Deque:

$ 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

答案 3 :(得分:62)

所有这些对象都跟踪自己的长度。提取长度的时间很短(大O符号中的O(1))并且主要由[粗略描述,用Python术语编写,而不是C术语]组成:在字典中查找“len”并将其发送到built_in len函数,它将查找对象的__len__方法并调用它......所有它必须做的就是return self.length

答案 4 :(得分:3)

len是O(1),因为列表在表中存储为表(一系列连续地址)。要知道表何时停止,计算机需要两件事:长度和起点。这就是为什么len()是O(1)的原因,计算机会存储该值,因此只需要查找它即可。

答案 5 :(得分:0)

我一直在考虑Python中的len()取决于列表的大小,因此如果多次使用,我总是将长度存储在变量中。但是今天在调试时,我注意到列表对象中的__len__属性,因此len()必须只是在获取它,这使得复杂度为O(1)。所以我只是用谷歌搜索是否有人已经问过这个帖子。