Skip to main content
 首页 » 编程设计

python之为什么在 Python 中使用 [e] * n(用于创建单个项目重复 n 次的列表)速度很快

2025年05月04日11jackei

后续来自: Create List of Single Item Repeated n Times in Python

python -m timeit '[0.5]*100000' 
1000 loops, best of 3: 382 usec per loop 
 
python -m timeit '[0.5 for i in range(100000)]' 
100 loops, best of 3: 3.07 msec per loop 

显然,由于 range(),第二个较慢。我不知道为什么 [e] * n 这么快(或者它是如何在 Python 内部实现的)。

请您参考如下方法:

dis.dis让您查看 Python 在评估每个表达式时执行的操作:

In [57]: dis.dis(lambda: [0.5]*100000) 
  1           0 LOAD_CONST               1 (0.5) 
              3 BUILD_LIST               1 
              6 LOAD_CONST               2 (100000) 
              9 BINARY_MULTIPLY      
             10 RETURN_VALUE         
 
In [58]: dis.dis(lambda: [0.5 for i in range(100000)]) 
  1           0 BUILD_LIST               0 
              3 LOAD_GLOBAL              0 (range) 
              6 LOAD_CONST               1 (100000) 
              9 CALL_FUNCTION            1 
             12 GET_ITER             
        >>   13 FOR_ITER                12 (to 28) 
             16 STORE_FAST               0 (i) 
             19 LOAD_CONST               2 (0.5) 
             22 LIST_APPEND              2 
             25 JUMP_ABSOLUTE           13 
        >>   28 RETURN_VALUE         

列表理解执行循环,每次加载常量 0.5,并将其附加到结果列表。

表达式[0.5]*100000 只需要一个BINARY_MULTIPLY .


另请注意,[obj]*N 生成一个长度为 N 的列表,其中 N 引用完全相同的 obj 。

列表理解 [expr for i in range(N)] 求值 expr N 次 --即使 expr 每次都计算出相同的值。