2017-11-11 159 views
3

代码1:我应该在哪里存储len(list)?

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

您不要在过程中会产生影响力的第二个增加两个元素结合在一起的事实:)这两个片段做了不同的工作,所以比较这些是没有意义的。 –

+1

试试吧,并告诉我们:) 运行这两种变化只是使用一个更大的列表,它的时间,并告诉我们结果 – immortal

+0

在你的情况下,你无法感受速度的不同! – ammarx

回答

0

是code2产生比代码1

`原因是每次都计算LEN这意味着你正在计算长度0时间码1(LEN(列表)* LEN(列表))其中快在代码2你区域算出列表的仅一个时间长度这里是O(LEN(列表) .`

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 
+0

你的陈述是不正确的。您计算第一个代码片段中的长度* O(n)*次,并在第二个代码段中执行* O(1)*次。请注意,当我们输入'for'循环时'range(..)'被构造一次。 –

+0

@WillemVanOnsem你怎么能说列表中的数百万的数字,它计算o(1)中的列表长度,你知道python的内部如何计算列表长度 –

+0

是的,它只是存储元素的数量。请参阅[这里](https://www.laurentluce.com/posts/python-list-implementation/)。 –

8

不会有明显的差异。 len(somelist)是非常快速的O(1)操作。列表的长度存储在内部,因此当您询问列表的长度时,几乎没有工作要做。

3

要回答标题中的问题:

我应该存储len(list)地方?

获取列表的长度需要O(1)时间和是usally相当快。在你的第一个代码片段中,您将获得清单为O(n)倍的长度,但这并不显著相比为O(n )算法的时间复杂度。

严格地说,我们当然可以不知道计算列表长度的时间复杂度(因为任何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,但在更高效的环境中处理本身。

1

没有区别,因为LEN()是一个非常便宜的操作,你可以很容易地检查:

┌[ nb-kondrashov: ~ ] 
└[ skondrashov ]-> 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) 

┌[ nb-kondrashov: ~ ] 
└[ skondrashov ]-> 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) 
┌[ nb-kondrashov: ~ ] 
└[ skondrashov ]-> time ./code1.py >> /dev/null 

real 0m0.153s 
user 0m0.152s 
sys 0m0.000s 
┌[ nb-kondrashov: ~ ] 
└[ skondrashov ]-> time ./code2.py >> /dev/null 

real 0m0.156s 
user 0m0.152s 
sys 0m0.000s 
┌[ nb-kondrashov: ~ ] 
└[ skondrashov ]-> 
相关问题