我应该把len(列表)存放在什么地方吗?

2024-05-08 15:25:21 发布

您现在位置: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快吗?你知道吗


Tags: 代码inforlenrangelistprint
3条回答

没有区别,因为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

不会有明显的区别。len(somelist)是一个非常快速的O(1)操作。列表的长度是存储在内部的,所以当你要求一个列表的长度时,要做的工作很少。你知道吗

回答标题中的问题:

Should I store len(list) somewhere?

获得一个列表的长度需要O(1)时间,而且通常相当快。在您的第一个代码片段中,您将获得列表的长度O(n)次,但是与算法的O(n2时间复杂度相比,这不是显著的。你知道吗

严格地说,我们当然不知道计算列表长度的时间复杂度(因为任何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连接起来,但在更高效的环境中进行处理。你知道吗

相关问题 更多 >