Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
扩展python列表的最佳解决方案是在列表的开头而不是尾部添加?_Python_Performance_List - Fatal编程技术网

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

扩展python列表的最佳解决方案是在列表的开头而不是尾部添加?,python,performance,list,Python,Performance,List,你有 x = ['a', 'b', 'c'] y = [1, 2, 3] 并希望在x开头插入列表y: x = [1, 2, 3, 'a', 'b', 'c'] 在Python中实现这一点的最佳解决方案是什么?当您想在左侧追加时,a比列表更有效。使用extendleft方法 >>> from collections import deque >>> d = deque(['a', 'b', 'c']) >>> d.extendleft(re

你有

x = ['a', 'b', 'c']
y = [1, 2, 3]
并希望在
x
开头插入列表
y

x = [1, 2, 3, 'a', 'b', 'c']

在Python中实现这一点的最佳解决方案是什么?

当您想在左侧追加时,a比列表更有效。使用
extendleft
方法

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

如果你总是只在左边添加,考虑将元素保持在列表中的顺序相反。

>>> x = ['a', 'b', 'c']
>>> y = [1, 2, 3]
>>> x = y + x
对于较小的输入大小,此简单解决方案的运行速度是使用
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
但是,输入尺寸越大,速度越慢:

>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

根据您对结果所做的操作,您可能根本不想列出:

new_x = itertools.chain(y, x)
现在有了一个迭代器,它将生成y中的所有值,然后生成x中的所有值。现在您可以对其进行迭代:

for val in new_x:
    blah blah
  • 非常简单
  • 性能特征:未知
  • 保留id(x)

@SimeonVisser:
reversed
返回反向迭代器,而不是构造反向列表。整个操作的空间复杂度是O(
len(y)
),但对于
反向的
只有O(1)@larsmans一个简单的
x=y+x
比你的代码花费了几乎一半的时间。@Ashwini Chaudhary:你是对的;我已经检查过了:
real 0m1.912s
real 0m5.368s
;这甚至比twice@IgorChubin我同意,但请注意,这些测试是不公平的,因为这包括初始导入时间。@AshwiniChaudhary您没有抓住要点,这样做并不是在测试将
y
放在前面的速度。您也在测试创建列表/deque所需的时间,但我们假设它们已经存在,并在开始时查看添加列表的最快方法。这不是创建列表并将其添加到开头的最快方法。
x=y+x
有什么问题吗?就其价值而言,第一个基准不仅测试了
appendleft
方法,还测试了导入
集合
、创建deque(需要列表文字)与创建列表文字所花费的时间,并调用
反向
。所以,这不是一个很好的比较。我已经每天使用Python 3年了,我从来都不知道你可以分配到一个列表片段。每天我都学习一个新的Python特性。然而。。。“应该有一种——最好只有一种——显而易见的方法来做到这一点。”
x[0:0] = y