使用嵌套循环进行更大的重复或仅将整个范围放入一个循环中会更好吗?哪个更快/更简单?

时间:2017-05-22 06:23:04

标签: python loops for-loop

哪一个更好?

for x in range(0,100):
   print("Lorem Ipsum")
for x in range(0,10):
    for y in range(0,10):
        print("Lorem Ipsum")

4 个答案:

答案 0 :(得分:4)

第二个更难阅读,你构建了一个不必要的range可迭代(Python 2中的list,消耗更少的内存并在Python 3中创建range对象的速度更快。

从不必要的迭代中,内部for循环构造了一个不必要的迭代器(Python 2中的list_iterator,Python 3中的range_iterator

答案 1 :(得分:1)

第一个更易读,更容易理解。使用它。

关于性能,我怀疑它有什么不同,如果确实如此,0-100会更快,因为它有更小的代码(如果没有优化双循环),因此代码路径更小。

如果对此类内容存在疑问,请在阅读代码时使用更易于理解的内容。过早优化是一种罪过。

答案 2 :(得分:1)

你可以使用dis模块中的dis来反汇编和分析你的一个循环更好的字节码(在某种程度上你的循环需要更少的内存,更少的迭代器等......)

这是一个追溯:

from dis import dis
def loop1():
    for x in range(100):
        pass

def loop2():
    for x in range(10):
        for j in range(10):
            pass

现在看看每个循环的内幕:

dis(loop1)
  2           0 SETUP_LOOP              20 (to 23)
              3 LOAD_GLOBAL              0 (range)
              6 LOAD_CONST               1 (100)
              9 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             12 GET_ITER
        >>   13 FOR_ITER                 6 (to 22)
             16 STORE_FAST               0 (x)

  3          19 JUMP_ABSOLUTE           13
        >>   22 POP_BLOCK
        >>   23 LOAD_CONST               0 (None)
             26 RETURN_VALUE

查看第二个循环中所需的数据量和操作量:

dis(loop2)
  2           0 SETUP_LOOP              43 (to 46)
              3 LOAD_GLOBAL              0 (range)
              6 LOAD_CONST               1 (10)
              9 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             12 GET_ITER
        >>   13 FOR_ITER                29 (to 45)
             16 STORE_FAST               0 (x)

  3          19 SETUP_LOOP              20 (to 42)
             22 LOAD_GLOBAL              0 (range)
             25 LOAD_CONST               1 (10)
             28 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             31 GET_ITER
        >>   32 FOR_ITER                 6 (to 41)
             35 STORE_FAST               1 (j)

  4          38 JUMP_ABSOLUTE           32
        >>   41 POP_BLOCK
        >>   42 JUMP_ABSOLUTE           13
        >>   45 POP_BLOCK
        >>   46 LOAD_CONST               0 (None)
             49 RETURN_VALUE

因为,两个循环都做同样的事情,第一个循环要好得多。

答案 3 :(得分:0)

想象一下如何修改101次迭代而不是100次的嵌套循环,缺点很明显。