- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
很好奇。
我注意到(至少在 py 2.6 和 2.7 中)float
具有所有熟悉的丰富比较函数:__lt__()
、__gt__
、__eq__
等
>>> (5.0).__gt__(4.5)
True
但 int
没有
>>> (5).__gt__(4)
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'int' object has no attribute '__gt__'
这对我来说很奇怪,因为运算符(operator)本身工作正常
>>> 5 > 4
True
字符串也支持比较函数
>>> "hat".__gt__("ace")
True
但所有 int
都是 __cmp__()
对我来说似乎很奇怪,所以我想知道为什么会这样。
刚刚经过测试,它在 python 3 中按预期工作,所以我假设一些遗留原因。不过还是想听听正确的解释;)
最佳答案
如果我们查看 PEP 207 for Rich Comparisions结尾有一句很有意思:
The inlining already present which deals with integer comparisons would still apply, resulting in no performance cost for the most common cases.
所以似乎在 2.x 中对整数比较进行了优化。如果我们 take a look at the source code我们可以找到这个:
case COMPARE_OP:
w = POP();
v = TOP();
if (PyInt_CheckExact(w) && PyInt_CheckExact(v)) {
/* INLINE: cmp(int, int) */
register long a, b;
register int res;
a = PyInt_AS_LONG(v);
b = PyInt_AS_LONG(w);
switch (oparg) {
case PyCmp_LT: res = a < b; break;
case PyCmp_LE: res = a <= b; break;
case PyCmp_EQ: res = a == b; break;
case PyCmp_NE: res = a != b; break;
case PyCmp_GT: res = a > b; break;
case PyCmp_GE: res = a >= b; break;
case PyCmp_IS: res = v == w; break;
case PyCmp_IS_NOT: res = v != w; break;
default: goto slow_compare;
}
x = res ? Py_True : Py_False;
Py_INCREF(x);
}
else {
slow_compare:
x = cmp_outcome(oparg, v, w);
}
因此,在 2.x 中似乎存在一个现有的性能优化 - 通过允许 C 代码直接比较整数 - 如果实现了丰富的比较运算符,则不会保留。
现在在 Python 3 中 __cmp__
不再受支持,因此必须有丰富的比较运算符。现在,据我所知,这不会导致性能下降。例如,比较:
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import timeit
>>> timeit.timeit("2 < 1")
0.06980299949645996
到:
Python 3.2.3 (v3.2.3:3d0686d90f55, Apr 10 2012, 11:25:50)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import timeit
>>> timeit.timeit("2 < 1")
0.06682920455932617
因此,似乎存在类似的优化,但我的猜测是,当考虑向后兼容性时,将它们全部放在 2.x 分支中的变化太大了。
在 2.x 中,如果您想要丰富的比较方法,您可以通过 operator
module 获得它们。 :
>>> import operator
>>> operator.gt(2,1)
True
关于Python:为什么 int 类没有像 `__lt__()` 这样丰富的比较运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10809932/
这个问题在这里已经有了答案: Comparing two lists using the greater than or less than operator (3 个答案) 关闭 6 年前。 假设
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 去年关闭。 Improve this questio
我希望能够按一个属性对类列表进行排序,而该属性恰好是另一个类 Date。我做了一些研究,想使用 sorted(list, key=lambda x:date) 排序方法,但看到 date 本身就是一个
假设我的 ClassA 的实例最终会出现在一个数据结构中,并且我们知道 sorted() 将被调用。调用 sorted() 的是别人的代码,所以我不能指定排序函数,但我可以在 ClassA 上实现任何
Python 2.x 有两种重载比较运算符的方法, __cmp__ 或“丰富的比较运算符”,例如 __lt__ . 富比较重载据说是首选,但为什么会这样呢? 丰富的比较运算符实现起来更简单,但您必须使
我创建了以下类: class Image(object): def __init__(self, extension, data, urls=None, user_data=None):
这个问题在这里已经有了答案: Python: default comparison (3 个答案) 关闭 10 年前。 我最感兴趣的是正在发生的事情,但可以说我有一个实现了 __eq__ 的自定义类
我看到过类似的问题,但是他们没有回答为什么python __lt__的优先级比__gt__高? 快速示例,让我给出一个父类(super class)和一个子类: class Person(object
我在 64 位 Windows 上使用 Python 3.5.1。我的问题是 Python 在排序时似乎忽略了用户定义类上的 __eq__ 和 __lt__ 运算符。在尝试对包含此类实例的元组进行排序
我一直在试验 Python 字典,发现 __gt__ 和 __lt__ 是为字典实现的。 我已经对它们进行了测试,它们似乎以某种方式比较了 key ,但我不太清楚这是如何完成的;例如,我不太确定 {1
在 Python3 中,functools.total_ordering decorator允许仅重载 __lt__ 和 __eq__ 以获得所有 6 个比较运算符。 我不明白为什么一个人必须写两个运
很好奇。 我注意到(至少在 py 2.6 和 2.7 中)float 具有所有熟悉的丰富比较函数:__lt__()、__gt__、__eq__ 等 >>> (5.0).__gt__(4.5) True
在下面的 Python 3.5 代码中,我想使用小于运算符 ( None: self.key = k self.next = None # type
我将 QListWidget 内的小部件设置为我自己的 ProductItemWidget 类,以便能够对列表中的项目进行更多自定义。这工作正常,但我无法让列表自动排序。我打电话 my_list.se
假设我有一个类,我想将其成员与常用运算符进行比较 == , , 和 >= . 据我所知,这可以通过初始化定义魔术方法来完成 __cmp__(a, b)返回 -1 ( a b )。 好像__cmp_
这个问题在这里已经有了答案: Is there a built in function for string natural sort? (23 个回答) 关闭 7 年前。 我有数据行并希望按如下方
我有一个intervaltree需要对Intervals进行排序并最终对Points进行排序的库。 我有一个 __cmp__ 方法,它强制执行非常稳定和逻辑的排序(请参阅代码末尾)。而且,我有一个有用
我是一名优秀的程序员,十分优秀!