$ cat code1.py
#!/usr/bin/env python3
for x in range(10000):
list=[1,2,3,4,5]
for i in range(len(list)):
for j in range(len(list)):
print(i+j)
$ cat code2.py
#!/usr/bin/env python3
for x in range(10000):
list=[1,2,3,4,5]
l=len(list)
for i in range(l):
for j in range(l):
print(i)
$ time ./code1.py >> /dev/null
real 0m0.153s
user 0m0.152s
sys 0m0.000s
$ time ./code2.py >> /dev/null
real 0m0.156s
user 0m0.152s
sys 0m0.000s
没有区别,因为len()是一个非常便宜的操作,您可以轻松地检查它:
不会有明显的区别。
len(somelist)
是一个非常快速的O(1)操作。列表的长度是存储在内部的,所以当你要求一个列表的长度时,要做的工作很少。你知道吗回答标题中的问题:
获得一个列表的长度需要O(1)时间,而且通常相当快。在您的第一个代码片段中,您将获得列表的长度O(n)次,但是与算法的O(n2)时间复杂度相比,这不是显著的。你知道吗
严格地说,我们当然不知道计算列表长度的时间复杂度(因为任何Python解释器可能会以不同的方式进行)。但是最流行的解释器CPython使用following datastructure:
它包含一个字段
allocated
,该字段存储可在固定时间内检索的已占用单元格数。你知道吗然而,您的程序在某种意义上是奇怪的,因为您在列表的索引上迭代,而不是在列表的元素上迭代。如果您想处理这些元素,那么使用这些元素会更加优雅和高效:
最后,我想补充一点,Python并不是真正被设计成最高效的编程环境。Python选择程序员的方便而不是速度(因为基本原理是开发时间比处理时间更昂贵)。因此,如果多次获得列表的长度确实是一个关键问题,那么Python可能不是处理列表的好选择。在这种情况下,您最好使用像
numpy
这样的库,它们被设计成批量处理。这些库将一些数组处理函数与Python连接起来,但在更高效的环境中进行处理。你知道吗相关问题 更多 >
编程相关推荐