Python:Python列表是否保留len()的计数,还是对每次调用计数?


79

如果我在很长的列表上继续调用len(),那是我在浪费时间,还是在后台保持int计数?


这总是困扰我。尤其是当我的分析器告诉我,我花了2.2秒运行一个程序,调用该函数一分钟。
内森2010年

Answers:


86

不用担心:当然,它可以节省计数,因此len()在列表中是一项非常便宜的操作。顺便说一句,字符串,字典和集合也是如此!


我相信它会保留最后一个项目的索引,如+1或类似的东西,并从该内存位置调用len()的值。我对吗?
geekidharsh



13

编写程序,以便对其进行优化以使其清晰易维护。致电可以使您的程序更清晰len(foo)吗?然后做。

您担心花费的时间吗?使用timeit标准库中模块衡量所花费的时间,并查看它在代码中是否有意义。

就像大多数人一样,您在猜测程序的哪些部分最慢时很可能是错误的。避免猜测的诱惑,而要通过测量找出答案。

请记住,用唐纳德·克努斯(Donald Knuth)的话说,过早的优化是万恶之源。仅关注测量速度的代码速度,以了解该好处是否值得更改其工作方式的成本。


1
我是一名编码员,仅在工作几个月后就接受了这两种做法。计时器的东西提供了两行防御,可抵御大量传统知识(“ SELECT .. RANDOM太昂贵”),这将使您陷入困境。
Jesvin Jose 2011年

5

该问题已得到回答(len是O(1)),但是您可以按照以下方法进行自我检查:

$ python -m timeit -s "l = range(10)" "len(l)"
10000000 loops, best of 3: 0.119 usec per loop
$ python -m timeit -s "l = range(1000000)" "len(l)"
10000000 loops, best of 3: 0.131 usec per loop

是的,不是真的慢。


3

Python“列表”实际上是可调整大小的数组,而不是链接列表,因此它将大小存储在某处。


0

它必须将长度存储在某处,因此您不必每次都在计算项目数。


4
请注意,并非每种语言都适用。某些语言实际上使用链表,并且可能会或可能不会使元数据保持在大约大小。一个完美的例子是Lisp,其中列表使用相对原始的2个单元结构来构建自身,而不使用元数据。在这些情况下,通话长度为O(n)。
阿什顿·K
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.