私は現在、コンプシの基礎コースを受講しています。私たちはPythonをよく使いますin
。それがどのように実装されているか、電源を入れるコードがどのin
ように見えるか、興味があります。
私はそのようなことの私の実装がどのように機能するかを考えることができます. 'コード。
私は現在、コンプシの基礎コースを受講しています。私たちはPythonをよく使いますin
。それがどのように実装されているか、電源を入れるコードがどのin
ように見えるか、興味があります。
私はそのようなことの私の実装がどのように機能するかを考えることができます. 'コード。
組み込み関数、型、演算子などに関する問題は、それらがPython で実装されていないことです。むしろ、それらは C で実装されています。C は、Python に常に適切に変換されるとは限らない、はるかに面倒で冗長なプログラミング言語です (通常、Python では他の方法の方が簡単なためです)。
そうは言っても、公開ソースリポジトリを介して、Python のすべての実装をオンラインで調べることができます。
の実装in
は分散しています。型ごとに 1 つの実装があり、さらに型固有の実装を呼び出すより一般的な実装があります (詳細は後述)。たとえば、リストの場合、リストの実装を探します。Python ソース ツリーでは、すべての組み込みオブジェクトのソースは Objects ディレクトリにあります。そのディレクトリには、リスト オブジェクトとそのすべてのメソッドの実装を含む listobject.c があります。
回答時のリポジトリで、393 行目を見ると、in 演算子 (__contains__
関数の名前を説明するメソッドとも呼ばれます) の実装が見つかります。要素が見つかるか、それ以上要素がなくなるまでリストのすべての要素をループし、検索結果を返すだけです。:)
それが役立つ場合、Python でこれを書く慣用的な方法は次のようになります。
def __contains__(self, obj):
for item in self:
if item == obj:
return True
return False
より一般的な実装があると前に述べました。PySequence_Contains
それはinの実装で見ることができますabstract.c
。型固有のバージョンを呼び出そうとし、それが失敗した場合は、通常の反復に頼ります。このループは、通常の Python の for ループを C で (Python C-API を使用して) 記述したときにどのように見えるかを示しています。
Python 言語リファレンスのデータモデルセクションから:
メンバーシップ テスト演算子 (
in
およびnot in
) は、通常、シーケンスの反復として実装されます。ただし、コンテナー オブジェクトは、オブジェクトがシーケンスである必要がない、より効率的な実装を備えた次の特別なメソッドを提供できます。
object.__contains__(self, item)
メンバーシップ テスト演算子を実装するために呼び出されます。アイテムが自分自身にある場合は true、そうでない場合は false を返す必要があります。マッピング オブジェクトの場合、値やキーと項目のペアではなく、マッピングのキーを考慮する必要があります。
を定義しないオブジェクト
__contains__()
の場合、メンバーシップ テストは最初に を介して反復を試行し__iter__()
、次に を介して古いシーケンス反復プロトコルを試行します__getitem__()
。言語リファレンスのこのセクションを参照してください。
したがって、デフォルトでは、Python はシーケンスを繰り返し処理してin
演算子を実装します。オブジェクトが__contains__
メソッドを定義する場合、Python は反復する代わりにそれを使用します。__contains__
では、メソッドでは何が起こるのでしょうか? 正確に知るには、ソースを参照する必要があります。__contains__
しかし、Python のリストは反復を使用して実装されていると言えます。Python の辞書とセットはハッシュ テーブルとして実装されるため、より高速なメンバーシップ テストがサポートされます。
Python の組み込みメソッドは C 言語で記述されています。そのコードは、Python のソース コードを自分でチェックアウトすることで確認できます。
ただし、Python 自体のすべてのメソッドの同等の実装を確認したい場合は、PyPyを確認できます。これは、100% Python で記述された Python 実装とそのサブセット (rpython) を備えています。
in
オペレーターは文字列オブジェクトでメソッドを呼び出すため__contains__
、両方のプロジェクトで文字列の実装を確認できますが、実際の検索コードはより深く埋もれています。
CPython のコードの一部を次に示します。たとえば、次のとおりです。
http://hg.python.org/cpython/file/c310233b1d64/Objects/stringlib/fastsearch.h
Python ソースをオンラインで参照できます: http://hg.python.org/
まず最初に、必要なリポジトリをクローンし、それを使用grep
して必要なものを見つけます。