为什么我的代码显示'for-loop‘的效率比’code‘的效率高?
# CODE-1:
import time
start_time = time.time()
for i in range(10000000):
1
end_time = time.time()
run_time = end_time - start_time
print('run_time1: ', run_time)
# CODE-2
start_time = time.time()
[1 for i in range(10000000)]
end_time = time.time()
run_time = end_time - start_time
print('run_time2: ', run_time)
# The results:
(1) run_time1: 0.5030415058135986
(2) run_time2: 1.1129977703094482发布于 2019-08-16 18:21:27
不同之处在于,使用comprehension创建list,使用for-loop仅调用1,其中最多只有一些数学表达式
for i in range(10000000):
1 # calling `1`, only expression
[1 for i in range(10000000)] # this creates list so there is more things to do than in first example发布于 2019-08-16 18:23:34
虽然这两个代码片段都没有做任何有用的事情(它们没有副作用,也不返回任何东西),但第二个版本实际上必须构造一个list对象,这会拖累它的性能。在Python 3.7+中运行:
>>> import dis
>>> dis.dis('''for i in range(10000000): 1''')
1 0 SETUP_LOOP 16 (to 18)
2 LOAD_NAME 0 (range)
4 LOAD_CONST 0 (10000000)
6 CALL_FUNCTION 1
8 GET_ITER
>> 10 FOR_ITER 4 (to 16)
12 STORE_NAME 1 (i)
14 JUMP_ABSOLUTE 10
>> 16 POP_BLOCK
>> 18 LOAD_CONST 1 (None)
20 RETURN_VALUE
>>> dis.dis('''[1 for i in range(10000000)]''')
1 0 LOAD_CONST 0 (<code object <listcomp> at 0x7f974a725db0, file "<dis>", line 1>)
2 LOAD_CONST 1 ('<listcomp>')
4 MAKE_FUNCTION 0
6 LOAD_NAME 0 (range)
8 LOAD_CONST 2 (10000000)
10 CALL_FUNCTION 1
12 GET_ITER
14 CALL_FUNCTION 1
16 RETURN_VALUE
Disassembly of <code object <listcomp> at 0x7f974a725db0, file "<dis>", line 1>:
1 0 BUILD_LIST 0
2 LOAD_FAST 0 (.0)
>> 4 FOR_ITER 8 (to 14)
6 STORE_FAST 1 (i)
8 LOAD_CONST 0 (1)
10 LIST_APPEND 2
12 JUMP_ABSOLUTE 4
>> 14 RETURN_VALUE您可以看到,listcomp对象比第一个循环做了更多的工作:每次迭代都执行BUILD_LIST和LIST_APPEND。
发布于 2019-08-16 18:51:33
正如其他人解释的那样,您的循环不会构建列表,因此速度更快。适当的比较应该如下所示。
循环:
l = []
for i in range(10000000):
l.append(1)列表理解:
l = [1 for i in range(10000000)]https://stackoverflow.com/questions/57522696
复制相似问题