如果我在一个很长的列表上继续调用len(),我是在浪费时间,还是在背景中保留int计数?
答案 0 :(得分:65)
不要担心:当然它会节省计数,因此列表上的len()
是一个非常便宜的操作。顺便说一句,对于字符串,字典和集合也是如此!
答案 1 :(得分:25)
如果您不想自己下载源代码,还可以通过 to look it up on Google Code Search look at the source on GitHub了解其完成方式。
static Py_ssize_t list_length(PyListObject *a)
{
return a->ob_size;
}
答案 2 :(得分:23)
答案 3 :(得分:9)
编写您的程序,使其为了清晰度而易于维护进行优化。通过拨打len(foo)
,您的计划是否更加清晰?然后这样做。
timeit
module in the standard library 衡量所花费的时间,看看它是否在您的代码中具有重要意义。
与大多数人一样,您可能会错误地猜测程序的哪些部分最慢。避免猜测的诱惑,而是测量它以找出答案。
请记住,用Donald Knuth的话说,过早优化是所有邪恶的根源。只关注你已经测量的代码的速度的速度,知道它是否值得改变其工作方式的成本。
答案 4 :(得分: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
是的,不是很慢。
答案 5 :(得分:3)
Python“list”实际上是一个可调整大小的数组,而不是链表,所以它将大小存储在某个地方。
答案 6 :(得分:0)
它必须存储某个地方的长度,所以你不是每次都计算物品的数量。