Sorting [was Re: Performance of int/long in Python 3]
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Wed Apr 3 10:43:26 EDT 2013
On Wed, 03 Apr 2013 07:52:42 -0400, Dave Angel wrote:
> I thought that the sort algorithm used a hash of all
> the items to be sorted, and only reverted to a raw comparison of the
> original values when the hash collided. Is that not the case? Or is
> the code you post here only used when the hash collides?
Sorting does not require that the elements being sorted are hashable.
If I have understood the implementation here:
http://hg.python.org/releasing/3.3.1/file/2ab2a09901f9/Objects/listobject.c
sorting in Python only requires that objects implement the less-than
comparison.
py> class Funny:
... def __init__(self, x):
... self.x = x
... def __lt__(self, other):
... return self.x < other.x
... def __gt__(self, x):
... raise AttributeError
... __le__ = __ge__ = __eq__ = __ne__ = __gt__
...
py> L = [Funny(i) for i in range(10)]
py> random.shuffle(L)
py> [f.x for f in L]
[8, 5, 7, 0, 9, 2, 3, 6, 1, 4]
py> [f.x for f in sorted(L)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
but if I change Funny.__lt__ to also raise, sorting fails.
I seem to recall that "sort relies only on < operator" is a language
promise, but I can't seem to find it documented anywhere official.
--
Steven
More information about the Python-list
mailing list