While we're talking about annoyances

Arnaud Delobelle arnodel at googlemail.com
Mon Apr 30 05:25:23 EDT 2007


On Apr 30, 2:50 am, a... at mac.com (Alex Martelli) wrote:
> Arnaud Delobelle <arno... at googlemail.com> wrote:
>
>    ...
>
> > > >>     decorated.sort()
>    ...
> > > def index(sequence):
> > >      return sorted(range(len(sequence)), key=sequence.__getitem__)
>    ...
> > But really these two versions of rank are slower than the original one
> > (as sorting a list is O(nlogn) whereas filling a table with
> > precomputed values is O(n) ).
>
> Wrong, because the original one also had a sort step, of course, so it
> was also, inevitably, O(N log N) -- I've quoted the .sort step above.

I am fully aware of the meaning of O(...).  Nevertheless (speed !=
asymptotic speed) and one sort is still better than two sorts IMHO.
Moreover the second sort is redundant and less clear than a simple
loop.

> > Anyway I would like to contribute my own index function:
>
> > def index(seq):
> >      return sum(sorted(map(list,enumerate(seq)), key=list.pop), [])
>
> > It's short and has the advantage of being self-documenting, which will
> > save Steven a lot of annoying typing I hope ;)  Who said Python
> > couldn't rival with perl?
>
> sum is for summing NUMBERS -- using it on lists is O(N squared).
>
> So, this solution is asymptotically VERY slow, as well as obfuscated.

And it was also a JOKE.  There were some clues:
   * I claimed that the function was self-documenting, even though it
was obviously obfuscated (as you rightly pointed out).
   * It relies on a side effect of the 'key' function list.pop, which
is very bad form.
   * It is indeed very slow (yes, sum() is not the best for lists)
   * I mentioned that Python could rival perl.

I was meant to be a clumsy but 'concise' amalgam that would perform
the task (although not efficiently) while being difficult to make
sense of.

--
Arnaud




More information about the Python-list mailing list