[Python-3000] Please re-add cmp to python 3000 (original) (raw)
Steven Bethard steven.bethard at gmail.com
Wed Oct 17 19:27:38 CEST 2007
- Previous message: [Python-3000] Please re-add __cmp__ to python 3000
- Next message: [Python-3000] Please re-add __cmp__ to python 3000
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On 10/17/07, David A. Wheeler <dwheeler at dwheeler.com> wrote:
I said: > I agree with Collin Winter: losing cmp is a loss (see http://oakwinter.com/code/).
Steven Bethard said: >Why can't this just be supplied with a mixin? Here's a recipe >providing the appropriate mixins if you want to define a key >function: > http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/510403 That works from a functional perspective, and if Python3 fails to include direct support for cmp, then I think providing a built-in mixin is necessary. But mixins for comparison are a BIG LOSER for sort performance if your fundamental operator is a cmp-like function. [snip] I did a test (see below), and the mixin using a simulated cmp took 50% MORE time to sort a list using Python 2.5
Patient: When I move my arm, it hurts. Doctor: Well don't move your arm then.
;-)
I'm having troubles coming up with things where the basic operator is really a cmp-like function. Even in your example, the cmp function was defined in terms of "less than". If the basic operator is really "less than", then why define a cmp() function at all? Particularly since, even in Python 2.5, sorting is faster when you define lt instead of cmp::
class NumberWithLessThan(object):
def __init__(self, data):
self.data = data
def __lt__(self, other):
return self.data < other.data
class NumberWithCmp(object):
def __init__(self, data):
self.data = data
def __cmp__(self, other):
return cmp(self.data, other.data)
$ python -m timeit -s "import script, random" "data =
[script.NumberWithLessThan(i) for i in xrange(1000)]; random.shuffle(data); data.sort()" 100 loops, best of 3: 7.93 msec per loop
$ python -m timeit -s "import script, random" "data =
[script.NumberWithCmp(i) for i in xrange(1000)]; random.shuffle(data); data.sort()" 100 loops, best of 3: 10.5 msec per loop
STeVe
I'm not in-sane. Indeed, I am so far out of sane that you appear a tiny blip on the distant coast of sanity. --- Bucky Katt, Get Fuzzy
- Previous message: [Python-3000] Please re-add __cmp__ to python 3000
- Next message: [Python-3000] Please re-add __cmp__ to python 3000
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]