gpt4 book ai didi

Python:为什么 int 类没有像 `__lt__()` 这样丰富的比较运算符?

转载 作者:IT老高 更新时间:2023-10-28 20:40:41 25 4
gpt4 key购买 nike

很好奇。

我注意到(至少在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com