通过在列表的开头添加而不是尾部来扩展python列表的最佳解决方案?

sor*_*rin 13 python performance list

你有

x = ['a', 'b', 'c']
y = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

并希望y在开头插入列表x:

x = [1, 2, 3, 'a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

在Python中执行此操作的最佳解决方案是什么?

Fre*_*Foo 13

如果要在左侧追加,则a deque比列表更有效.使用该extendleft方法.

>>> from collections import deque
>>> d = deque(['a', 'b', 'c'])
>>> d.extendleft(reversed([1, 2, 3]))
>>> d
deque([1, 2, 3, 'a', 'b', 'c'])
Run Code Online (Sandbox Code Playgroud)

如果您始终在左侧附加,请考虑以相反的顺序将元素保留在列表中.

  • @SimeonVisser:`reversed`返回一个反向迭代器,而不是构造一个反向列表.对于整个操作,空间复杂度为O("len(y)"),但对于"反向",只有O(1). (4认同)
  • @larsmans一个简单的`x = y + x`几乎占用了你代码的一半时间. (3认同)

Ash*_*ary 13

>>> x = ['a', 'b', 'c']
>>> y = [1, 2, 3]
>>> x = y+x
Run Code Online (Sandbox Code Playgroud)

deque对于较小的输入尺寸,这个简单的解决方案运行速度是解决方案的两倍:

$ cat x1.py 
for i in range(1000000):
    x = ['a', 'b', 'c']
    y = [1, 2, 3]
    x = y+x

$ cat x2.py 
from collections import deque
for i in range(1000000):
    d = deque(['a', 'b', 'c'])
    d.extendleft(reversed([1, 2, 3]))

$ time python x1.py

real    0m1.912s
user    0m1.864s
sys     0m0.040s

$ time python x2.py

real    0m5.368s
user    0m5.316s
sys     0m0.052s
Run Code Online (Sandbox Code Playgroud)

但是,对于较大尺寸的输入,它会变慢:

>python -m timeit -s "y = range(100000)" "x = list(xrange(10000000)); y+x"
10 loops, best of 3: 229 msec per loop

>python -m timeit -s "from collections import deque; y = range(100000)" "d = deque(xrange(10000000)); d.extendleft(reversed(y))"
10 loops, best of 3: 178 msec per loop
Run Code Online (Sandbox Code Playgroud)

  • 就其价值而言,第一个基准测试不仅测试 `appendleft` 方法,还测试导入 `collections`、创建双端队列(需要列表文字)与创建列表文字以及调用 `reversed` 所产生的时间。所以恕我直言,这*不是*一个很好的比较。 (3认同)

Ned*_*der 9

根据您对结果的处理,您可能根本不想制作列表:

new_x = itertools.chain(y, x)
Run Code Online (Sandbox Code Playgroud)

现在你有一个迭代器,它将生成y中的所有值,然后生成x中的所有值.现在你可以迭代它:

for val in new_x:
    blah blah
Run Code Online (Sandbox Code Playgroud)


Lio*_*bro 7

x[0:0] = y
Run Code Online (Sandbox Code Playgroud)
  • 非常简单
  • 表现特征:未知
  • 保留id(x)

  • 每天使用 Python 已有 3 年了,我从来不知道可以分配给列表切片。每天我都会学习一个新的 Python 功能。然而……“应该有一种——最好只有一种——明显的方法来做到这一点。” (2认同)