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

Andre Engels andreengels at gmail.com
Fri Nov 6 16:12:59 CET 2009


On Fri, Nov 6, 2009 at 1:12 PM, kj <no.email at please.post> wrote:
>
> 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?

It depends - what do you want to do with it? My first hunch would be
to use a dictionary instead of a list, then the whole problem
disappears. If there is a reason you don't want to do that, what is
it?


-- 
André Engels, andreengels at gmail.com



More information about the Python-list mailing list