代码1:
list=[1,2,3,4,5]
for i in range(len(list)):
for j in range(len(list)):
print(i+j)
码2:
list=[1,2,3,4,5]
l=len(list)
for i in range(l):
for j in range(l):
print(i+j)
剂量代码2比代码1快?
答案 0 :(得分:8)
没有明显的区别。 len(somelist)
是一项非常快速的O(1)操作。列表的长度存储在内部,因此当您询问列表的长度时,要做的工作很少。
答案 1 :(得分:3)
回答标题中的问题:
我应该在某个地方存储
len(list)
吗?
获取列表的长度需要 O(1)时间,并且通常非常快。在第一个代码片段中,您将获得列表的长度 O(n)次,但与 O(n )相比, 2 )算法的时间复杂度。
严格来说,我们当然不知道计算列表长度的时间复杂度(因为任何Python解释器可能会以不同的方式执行)。但最流行的解释器 CPython 使用following datastructure:
typedef struct {
PyObject_VAR_HEAD
PyObject **ob_item;
Py_ssize_t allocated;
} PyListObject;
它包含一个字段allocated
,用于存储可以在固定时间内检索的已占用单元格数。
您的程序很奇怪,因为您迭代列表的索引,而不是列表的元素。如果您想要处理元素,使用它会更优雅和高效:
# processing the elements of the list:
some_list = [1,4,2,5]
for elem1 in some_list:
for elem2 in some_list:
print(elem1+elem2)
最后,我想补充一点,Python并没有真正被设计成最有效的编程环境。 Python选择了程序员在速度上的便利性(因为开发时间比处理时间更昂贵)。因此,如果多次获得列表的长度,确实是一个关键问题,Python可能不是开始处理列表的好选择。在这种情况下,您最好使用像numpy
这样的库来批量处理。这些库将一些数组处理函数与Python接口,但是在更有效的环境中进行处理。
答案 2 :(得分:1)
没有区别,因为len()是一个非常便宜的操作,你可以轻松检查它:
$ 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
答案 3 :(得分:0)
是的,code2比代码1
更快`每次计算len时,原因都在代码1中,这意味着你计算长度 0(len(list)* len(list))在代码2中你所计算的区域只有一次这里列表的长度是 o(len(list) .`
def abc():
list=[1,2,3,4,5]
for i in range(len(list)):
for j in range(len(list)):
print(i+j)
def mmm():
list = [1, 2, 3, 4, 5]
l = len(list)
for i in range(l):
for j in range(l):
print(i + j)
from time import time
t0 = time()
abc()
t1 = time()
mmm()
t2 = time()
print 'function1 takes %f' %(t1-t0)
print 'function2 takes %f' %(t2-t1)
输出:
function1 takes 0.000091
function2 takes 0.000065