copysort patch, was RE: [Python-Dev] inline sort option

Alex Martelli aleaxit at yahoo.com
Sat Oct 18 11:43:38 EDT 2003


On Saturday 18 October 2003 05:16 pm, Skip Montanaro wrote:
>     Guido> For one, this will surely make lots of people write
>
>     Guido>   for key in D.keys().copysort():
>     Guido>       ...
>
>     Guido> which makes an unnecessary copy of the keys.
>
> It might be viewed as unnecessary if you intend to change D's keys within
> the loop.

D.keys() makes a _snapshot_ of the keys of D -- it doesn't matter what
you do to D in the loop's body.

Admittedly, that's anything but immediately obvious (quite apart from
copysorting or whatever) -- I've seen people change perfectly good
code of the form:
    for k in D.keys():
        vastly_alter_a_dictionary(D, k)
into broken code of the form:
    for k in D:
        vastly_alter_a_dictionary(D, k)
because of having missed this crucial difference -- snapshot in the
first case, but NOT in the second one.  And viceversa, I've seen people
carefully copy.copy(D.keys()) or the equivalent to make sure they did
not suffer from modifying D in the loop's body -- the latter is in a sense
even worse, because the bad effects of the former tend to show up
pretty fast as weird bugs and broken unit-tests, while the latter is "just"
temporarily wasting some memory and copying time.

Anyway, copysort with The Trick, either as a method or function, has
no performance problems - exactly the same performance as:

>     Guido>   keys = D.keys()
>     Guido>   keys.sort()
>     Guido>   for key in keys:
>     Guido>       ...
>
> Current standard practice is also fine.

Nolo contendere.  It DOES feel a bit like boilerplate, that's all.


Alex




More information about the Python-Dev mailing list