$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
You should use [0] * n
to generate a list with n
zeros.
See why [] is faster than list()
There is a gotcha though, both itertools.repeat
and [0] * n
will create lists whose elements refer to same id
. This is not a problem with immutable objects like integers or strings but if you try to create list of mutable objects like a list of lists ([[]] * n
) then all the elements will refer to the same object.
a = [[]] * 10
a[0].append(1)
a
> [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
[0] * n
will create the list immediately while repeat
can be used to create the list lazily when it is first accessed.
If you're dealing with really large amount of data and your problem doesn't need variable length of list or multiple data types within the list it is better to use numpy
arrays.
timeit('numpy.zeros(100000, numpy.int)', 'import numpy', number=1000)
> 0.057849884033203125
numpy
arrays will also consume less memory.