is
比較 ( 、==
、<=
など)を実装する Python ソース コードを次に示します。
Python/ceval.c:4501
static PyObject *
cmp_outcome(int op, register PyObject *v, register PyObject *w)
{
int res = 0;
switch (op) {
case PyCmp_IS:
res = (v == w);
break;
...
default:
return PyObject_RichCompare(v, w, op);
is
は、単純な C ポインター比較という 1 行のコードで実装されます。一部の Python プリミティブは、これに従って等しいと比較されます (interning のため、または 、 、 のようなシングルトンであるTrue
ためFalse
) None
。
一方、ヘルパー関数で実装されている をeq
使用します。PyObject_RichCompare
do_richcompare
richcmpfunc f;
PyObject *res;
int checked_reverse_op = 0;
if (v->ob_type != w->ob_type &&
PyType_IsSubtype(w->ob_type, v->ob_type) &&
(f = w->ob_type->tp_richcompare) != NULL) {
checked_reverse_op = 1;
res = (*f)(w, v, _Py_SwappedOp[op]);
if (res != Py_NotImplemented)
return res;
Py_DECREF(res);
}
if ((f = v->ob_type->tp_richcompare) != NULL) {
res = (*f)(v, w, op);
if (res != Py_NotImplemented)
return res;
Py_DECREF(res);
}
if (!checked_reverse_op && (f = w->ob_type->tp_richcompare) != NULL) {
res = (*f)(w, v, _Py_SwappedOp[op]);
if (res != Py_NotImplemented)
return res;
Py_DECREF(res);
}
これにより、引数の型がチェック__eq__
され、答えを決定する前に複数の比較関数 (メソッド) が試行される可能性があります。比較メソッドは無制限の作業を行う可能性があります (たとえばlist.__eq__
、リストの各要素をおそらく再帰的にチェックする必要があります) が、単純な の場合でもx == None
、型チェックとすべての余分な作業により、 に比べて実際の速度が低下しis
ます。