Ответ 1
Если мы посмотрим на PEP 207 для Rich Comparisions, в конце этого предложения есть интересное:
Вложенная уже существующая, которая имеет дело с целыми сравнениями, по-прежнему будет применяться, что приведет к отсутствию затрат на производительность для наиболее распространенных случаев.
Итак, кажется, что в 2.x существует оптимизация для целочисленного сравнения. Если мы посмотрим на исходный код, мы можем найти это:
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