$python 2.7.8
from timeit import timeit
import numpy
timeit("list(0 for i in xrange(0, 100000))", number=1000)
> 8.173301935195923
timeit("[0 for i in xrange(0, 100000)]", number=1000)
> 4.881675958633423
timeit("[0] * 100000", number=1000)
> 0.6624710559844971
timeit('list(itertools.repeat(0, 100000))', 'import itertools', number=1000)
> 1.0820629596710205
Debe usar [0] * n
para generar una lista con n
ceros.
See why [] is faster than list()
Hay una Gotcha embargo, tanto itertools.repeat
y [0] * n
creará listas cuyos elementos se refieren a id
misma. Esto no es un problema con objetos inmutables como enteros o cadenas, pero si intenta crear una lista de objetos mutables como una lista de listas ([[]] * n
), entonces todos los elementos se referirán al mismo objeto.
a = [[]] * 10
a[0].append(1)
a
> [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
[0] * n
va a crear la lista de inmediato, mientras repeat
se puede utilizar para crear la lista perezosamente cuando se accede a ella por primera vez.
Si se trata de una gran cantidad de datos y su problema no necesita una longitud variable de la lista o múltiples tipos de datos dentro de la lista, es mejor utilizar las matrices numpy
.
timeit('numpy.zeros(100000, numpy.int)', 'import numpy', number=1000)
> 0.057849884033203125
numpy
matrices también consumirán menos memoria.
Para matrices numéricas grandes, debe usar 'numpy', que tiene una función' ceros' para hacer esto. – katrielalex