预先写入一个简短的Python列表是什么样的惯用语法?

list.append()是添加到列表末尾的明显select。 这是对缺lesslist.prepend()的合理解释 。 假设我的清单很短,性能问题可以忽略不计

 list.insert(0, x) 

要么

 list[0:0] = [x] 

地道?

s.insert(0, x)forms是最常见的。

每当你看到它,可能是时候考虑使用一个collections.deque而不是一个列表。

如果你可以用function的方式,下面是非常清楚

 new_list = [x] + your_list 

当然,你还没有将x插入到your_list ,而是用x预先创build了一个新的列表。

如果有人发现像我这样的问题,这里是我提出的方法的性能testing:

 Python 2.7.8 In [1]: %timeit ([1]*1000000).insert(0, 0) 100 loops, best of 3: 4.62 ms per loop In [2]: %timeit ([1]*1000000)[0:0] = [0] 100 loops, best of 3: 4.55 ms per loop In [3]: %timeit [0] + [1]*1000000 100 loops, best of 3: 8.04 ms per loop 

正如你所看到的, insert和切片分配几乎是显式加法的两倍,并且在结果中非常接近。 正如Raymond Hettinger所说, insert是比较常见的选项,而我个人更喜欢这种方式来预先列表。

预先写入一个简短的Python列表是什么样的惯用语法?

list.insert

list.insert可以这样使用。

 list.insert(0, x) 

但是这样做效率不高,因为在Python中, list是一个指针数组,现在Python必须把列表中的每个指针都移到下一个指针,以便在第一个指针中插入指向你的对象的指针,所以这只是有效的因为你问的是相当短的名单。

deque.appendleft

正如Raymond所说,考虑一个collections.deque ,它有许多列表方法,但也有一个appendleft方法(以及popleft )。 deque是一个双端队列 – 不pipe长度如何,总是需要花费相同的时间预先计算一些东西。 在大O符号中,O(1)与列表的O(n)时间。 用法如下:

 >>> import collections >>> d = collections.deque('1234') >>> d deque(['1', '2', '3', '4']) >>> d.appendleft('0') >>> d deque(['0', '1', '2', '3', '4']) 

listdeque性能

 import timeit from collections import deque def list_insert_0(): l = [] for i in range(20): l.insert(0, i) def list_slice_insert(): l = [] for i in range(20): l[:0] = [i] # semantically same as list.insert(0, i) def list_add(): l = [] for i in range(20): l = [i] + l # caveat: new list each time def deque_appendleft(): d = deque() for i in range(20): d.appendleft(i) # semantically same as list.insert(0, i) 

和performance:

 >>> min(timeit.repeat(list_insert_0)) 5.975241085048765 >>> min(timeit.repeat(list_slice_insert)) 5.7418839619494975 >>> min(timeit.repeat(list_add)) 6.059992871945724 >>> min(timeit.repeat(deque_appendleft)) 2.958612001966685 

列表操作全部执行类似,而且双端队列速度大约快两倍。 随着名单变得越来越长,我希望更好的performance。

第一个肯定更清晰,expression意图要好得多:你只想插入一个元素,而不是一个完整的列表。