Rich Comparisionsの PEP 207 を見ると、この興味深い文が最後にあります。
整数比較を扱う既に存在するインライン化は引き続き適用されるため、最も一般的なケースではパフォーマンス コストは発生しません。
したがって、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
モジュールを介して取得できます。
>>> import operator
>>> operator.gt(2,1)
True