为什么for循环的效率比列表推导低?

for循环版本

dis.dis('for i in array: a.append(i+1)')
  1           0 SETUP_LOOP              26 (to 28)
              2 LOAD_NAME                0 (array)
              4 GET_ITER
        >>    6 FOR_ITER                18 (to 26)
              8 STORE_NAME               1 (i)
             10 LOAD_NAME                2 (a)
             12 LOAD_ATTR                3 (append)
             14 LOAD_NAME                1 (i)
             16 LOAD_CONST               0 (1)
             18 BINARY_ADD
             20 CALL_FUNCTION            1
             22 POP_TOP
             24 JUMP_ABSOLUTE            6
        >>   26 POP_BLOCK
        >>   28 LOAD_CONST               1 (None)
             30 RETURN_VALUE

列表推导式版本

dis.dis('[x+1 for x in array]')
  1           0 LOAD_CONST               0 (<code object <listcomp> at 0x00000163C9D04C00, file "<dis>", line 1>)
              2 LOAD_CONST               1 ('<listcomp>')
              4 MAKE_FUNCTION            0
              6 LOAD_NAME                0 (array)
              8 GET_ITER
             10 CALL_FUNCTION            1
             12 RETURN_VALUE

上面已经从本质说明了为什么会这样(大致可以体现)

下面我们从具体表现来看:

#循环
array=range(1000)
a=[]
%timeit for i in array: a.append(i+1)
79.5 µs ± 2.83 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

#列表推导
%timeit [x+1 for x in array]
34 µs ± 508 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

可以看出有两倍的差距

总结

列表推导属于python语法糖的一种

但我们也没有必要去讲究何时用何时不用。因为具体的速度还是不一定的 。并且,列表推导的目的只是为了生成列表,如果你想生成其他玩意,可以去研究生成器表达式。用于生成除了列表以外的序列

Last modification:May 8, 2022
如果觉得我的内容对你有用,请随意赞赏