我应该在某处存放len(列表)吗?

时间:2017-11-11 12:47:29

标签: python

代码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快?

4 个答案:

答案 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