如果我继续在很长的列表上调用len(),我是在浪费时间,还是在后台保留int计数?
不要担心:当然它会节省计数,因此len()
列表是一个非常便宜的操作.顺便说一句,对于字符串,字典和集合也是如此!
还有一种方法可以找出它是如何完成的 在Google Code Search上查找 如果您不想自己下载源代码,请查看GitHub上的源代码.
static Py_ssize_t list_length(PyListObject *a) { return a->ob_size; }
len
是O(1)操作.
编写程序,使其优化清晰,易于维护.打电话给你的节目更清楚len(foo)
吗?然后这样做.
你担心时间吗?使用timeit
标准库中的模块来测量所花费的时间,并查看它是否在您的代码中是重要的.
与大多数人一样,您可能会错误地猜测程序的哪些部分最慢.避免猜测的诱惑,而是测量它以找出答案.
请记住,用唐纳德克努特的话说,过早的优化是所有邪恶的根源.只关注你测量速度的代码速度,知道它是否值得改变其工作方式的成本.
这个问题已经回答了(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
是的,不是真的慢.