哪一个更好?
for x in range(0,100):
print("Lorem Ipsum")
for x in range(0,10):
for y in range(0,10):
print("Lorem Ipsum")
答案 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次的嵌套循环,缺点很明显。