Most efficient way to "pre-grow" a list?

kj no.email at please.post
Fri Nov 6 13:12:40 CET 2009


In Perl one can assign a value to any element of an array, even to
ones corresponding to indices greater or equal than the length of
the array:

  my @arr;
  $arr[999] = 42;

perl grows the array as needed to accommodate this assignment.  In
fact one common optimization in Perl is to "pre-grow" the array to
its final size, rather than having perl grow it piecemeal as required
by assignments like the one above:

  my @arr;
  $#arr = 999_999;

After assigning to $#arr (the last index of @arr) as shown above,
@arr has length 1,000,000, and all its elements are initialized to
undef.

In Python the most literal translation of the first code snippet
above triggers an IndexError exception:

>>> arr = list()
>>> arr[999] = 42
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range

In fact, one would need to pre-grow the list sufficiently to be
able to make an assignment like this one.  I.e. one needs the
equivalent of the second Perl snippet above.

The best I can come up with is this:

arr = [None] * 1000000

Is this the most efficient way to achieve this result?

TIA!

kynn




More information about the Python-list mailing list