list.append()es la opción obvia para agregar al final de una lista. Aquí hay una explicación razonable para los desaparecidos list.prepend(). Asumiendo que mi lista es corta y las preocupaciones de rendimiento son insignificantes, es
list.insert(0, x)
o
list[0:0] = [x]
¿idiomático?

Si puede seguir el camino funcional, lo siguiente es bastante claro
Por supuesto no se ha insertado
xenyour_list, en lugar de haber creado una nueva lista conxpreprended a ella.fuente
Por lo general, no desea anteponer repetidamente a una lista en Python.
Si es corto , y no lo estás haciendo mucho ... entonces está bien.
list.insertEl
list.insertpuede ser usado de esta manera.Pero esto es ineficiente, porque en Python, a
listes una matriz de punteros, y Python ahora debe tomar cada puntero en la lista y moverlo hacia abajo para insertar el puntero en su objeto en la primera ranura, por lo que esto es realmente eficiente para listas más bien cortas, como preguntas.Aquí hay un fragmento de la fuente CPython donde se implementa esto, y como puede ver, comenzamos al final de la matriz y movemos todo hacia abajo por uno para cada inserción:
Si desea un contenedor / lista que sea eficiente para anteponer elementos, desea una lista vinculada. Python tiene una lista doblemente vinculada, que se puede insertar al principio y al final rápidamente, se llama a
deque.deque.appendleftA
collections.dequetiene muchos de los métodos de una lista.list.sortes una excepción, por lo quedequedefinitivamente no es completamente sustituible por Liskovlist.El
dequetambién tiene unappendleftmétodo (así comopopleft). Eldequees una cola de doble extremo y una lista doblemente enlazada: no importa la longitud, siempre lleva la misma cantidad de tiempo pretender algo. En la notación O grande, O (1) versus el tiempo O (n) para las listas. Aquí está el uso:deque.extendleftTambién es relevante el
extendleftmétodo de deque , que antecede iterativamente:Tenga en cuenta que cada elemento se antepondrá uno a la vez, invirtiendo efectivamente su orden.
Rendimiento de
listversusdequePrimero configuramos con algunos pretendientes iterativos:
y rendimiento:
El deque es mucho más rápido. A medida que las listas se alarguen, esperaría que una deque funcione aún mejor. Si puede usar deque
extendleftprobablemente obtendrá el mejor rendimiento de esa manera.fuente
Si alguien encuentra esta pregunta como yo, aquí están mis pruebas de rendimiento de los métodos propuestos:
Como puede ver, la
insertasignación de divisiones es casi el doble de rápida que la suma explícita y los resultados son muy parecidos. Como Raymond Hettinger señalóinsertes una opción más común y yo personalmente prefiero esta forma de anteponer a la lista.fuente
.inserty[0:0] = [0]funcionan en el lugar , todavía tienen que reasignar todo el búfer.