代码之家  ›  专栏  ›  技术社区  ›  colidyre

为什么range()-函数的速度慢于乘以项以在嵌套列表中获取副本?

  •  5
  • colidyre  · 技术社区  · 8 年前

    要复制现有列表中的嵌套列表,不幸的是,仅将其相乘还不够,否则将创建引用,而不是列表中的独立列表,请参见以下示例:

    x = [[1, 2, 3]] * 2
    x[0] is x[1]  # will evaluate to True
    

    为了实现您的目标,您可以在列表理解中使用range函数,例如,请参见:

    x = [[1, 2, 3] for _ in range(2)]
    x[0] is x[1]  # will evaluate to False (wanted behaviour)
    

    这是一种不用创建引用就可以在列表中增加项目的好方法,而且在许多不同的网站上也会多次解释这一点。

    但是,有一种更有效的方法来复制列表元素。对于我来说,该代码似乎快了一点(通过命令行通过timeit进行测量,对于下面的代码和上面代码中的范围(n),使用不同的参数n__1、50、100、10000_进行测量):

    x = [[1, 2, 3] for _ in [0] * n]
    

    但我想知道,为什么这段代码运行得更快?是否还有其他缺点(内存消耗更大或类似)?

    python -m timeit '[[1, 2, 3] for _ in range(1)]'
    1000000 loops, best of 3: 0.243 usec per loop
    
    python -m timeit '[[1, 2, 3] for _ in range(50)]'
    100000 loops, best of 3: 3.79 usec per loop
    
    python -m timeit '[[1, 2, 3] for _ in range(100)]'
    100000 loops, best of 3: 7.39 usec per loop
    
    python -m timeit '[[1, 2, 3] for _ in range(10000)]'
    1000 loops, best of 3: 940 usec per loop
    
    python -m timeit '[[1, 2, 3] for _ in [0] * 1]'
    1000000 loops, best of 3: 0.242 usec per loop
    
    python -m timeit '[[1, 2, 3] for _ in [0] * 50]'
    100000 loops, best of 3: 3.77 usec per loop
    
    python -m timeit '[[1, 2, 3] for _ in [0] * 100]'
    100000 loops, best of 3: 7.3 usec per loop
    
    python -m timeit '[[1, 2, 3] for _ in [0] * 10000]'
    1000 loops, best of 3: 927 usec per loop
    
    
    # difference will be greater for larger n
    
    python -m timeit '[[1, 2, 3] for _ in range(1000000)]'
    10 loops, best of 3: 144 msec per loop
    
    python -m timeit '[[1, 2, 3] for _ in [0] * 1000000]'
    10 loops, best of 3: 126 msec per loop
    
    1 回复  |  直到 8 年前
        1
  •  4
  •   Yann Vernier    8 年前

    range

    int

    itertools repeat for _ in repeat(None, x)