国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Python の內(nèi)部動作

Nov 04, 2024 pm 01:45 PM

Internal Working Of Python

完全なコード ファイルは次のとおりです: Code

1.ソースコード

Python スクリプトを作成すると、それは人間が読めるテキストになります。このソース コードはすべての出発點です。

.py ファイルに記述された Python ソース コードは、人間が判読可能です。このコードは、プログラムの動作を定義し、変數(shù)、関數(shù)、ループなどを指定します。

2.バイトコードへのコンパイル (コンパイラー)

Python プログラムを?qū)g行するときの最初のステップは、ソース コードをバイトコードにコンパイルすることです。これは Python インタプリタによって行われます:

  • 構(gòu)文チェック: 構(gòu)文エラーがないことを確認します。
  • コンパイル: 高レベルのソース コードを、下位レベルのプラットフォームに依存しない表現(xiàn)であるバイトコードに変換します。このバイトコードは通常、__pycache__ ディレクトリ內(nèi)の .pyc ファイルに存在します。
    • コンパイラー: Python はインタープリターを使用しますが、最初にソース コードをバイトコードとして知られる低レベルの形式にコンパイルします。
  • トークン化: コードをトークン (キーワード、演算子、識別子など) と呼ばれる小さな部分に分割します。
  • 解析: トークンを分析して、Python の構(gòu)文ルールに従っていることを確認します。
  • 制御フロー グラフ (CFG): プログラムの実行中にプログラムを通過する可能性のあるすべてのパスを表します。
  • バイトコード生成: 解析されたトークンを、Python 仮想マシン (PVM) の一連の命令であるバイトコードに変換します。

Internal Working Of Python

これについて詳しく見ていきましょう。

Python コンパイラー: Python はインタープリタ言語として知られていますが、コンパイル手順があります。內(nèi)訳は次のとおりです:

トークン化:

  • コードをトークン (キーワード、演算子、識別子など) と呼ばれる小さな部分に分割します。
  1. ソース コード: 作成したコードから始まります。
  2. トークナイザー (Lexer): ソース コードを、キーワード (for、if)、演算子 ( 、 -)、識別子 (変數(shù)名)、リテラル (數(shù)値や文字列など) などのトークンと呼ばれる小さな部分に分割します。 .
  3. 解析: トークンを分析して、Python の構(gòu)文ルールに従っていることを確認します。
  4. 構(gòu)文分析: パーサーはこれらのトークンを取得し、Python の文法規(guī)則と照合してチェックします。
  5. 解析ツリー: コードの文法構(gòu)造を表すトークンからツリー構(gòu)造を構(gòu)築します。
  6. セマンティック分析: データ型、スコープ、その他のコンテキスト固有のルールの観點からコードが意味をなしていることを確認します。
  7. 制御フロー グラフ (CFG): プログラムの実行中にプログラムを通過する可能性のあるすべてのパスを表します。
    • 制御フロー グラフ: 実行中にコードを通過する可能性のあるすべてのパスを表します。
    • ノードとエッジ: 各ノードはコードの基本ブロックを表し、エッジはあるブロックから別のブロックへの制御の流れを表します。
  8. バイトコード生成: 解析されたトークンを、Python 仮想マシン (PVM) の一連の命令であるバイトコードに変換します。
    • バイトコードは、ソース コードをよりコンパクトに低レベルで表現(xiàn)したもので、実行用に最適化されています。プラットフォームに依存しないため、互換性のある PVM を備えた任意のシステムで実行できます。
    • バイトコード: 解析されたコードは、下位レベルのプラットフォームに依存しない表現(xiàn)であるバイトコードに変換されます。
    • 命令セット: このバイトコードは、Python 仮想マシン (PVM) が実行できる命令のセットです。今後の実行を高速化するために、バイトコードは __pycache__ ディレクトリの .pyc ファイルに保存されます。

3.バイトコード(バイトコード)をロード中

コンパイル後、Python 仮想マシンはバイトコードをロードします。

  • キャッシュからの読み取り: バイトコードが以前にコンパイルされており、変更されていない場合は、キャッシュ (__pycache__) から読み取られます。これにより、コンパイル手順がスキップされ、実行が高速化されます。
    • バイトコードがメモリにロードされ、実行できるようになります。その後、バイトコードは PVM によって実行され、プログラムのタスクを?qū)g行するための命令が解釈されます。

4. PVM(PVM)による実行

PVM はバイトコードを解釈して実行します。

  • 命令実行: PVM は各バイトコード命令を読み取り、実行します。各命令は、値のロード、演算の実行、関數(shù)の呼び出しなどの特定の操作に対応します。
  • メモリ管理: 変數(shù)とオブジェクトのメモリの割り當(dāng)てと割り當(dāng)て解除を管理します。

Python でのメモリ管理:

  1. 參照カウント: Python は、メモリ內(nèi)のオブジェクトへの參照の數(shù)を追跡します。參照カウントがゼロになると、オブジェクトによって占有されていたメモリを再利用できます。
  2. オブジェクトの割り當(dāng)て: コードの実行時に、Python オブジェクト (整數(shù)、文字列、リストなど) がメモリ內(nèi)に作成されます。
  3. ガベージ コレクション: Python には、使用されなくなったメモリ (つまり、參照カウントがゼロのオブジェクト) の割り當(dāng)てを解除することでメモリの管理に役立つガベージ コレクタがあります。
  4. メモリ プーリング: Python はメモリのプールを使用して、小さなオブジェクトをより効率的に割り當(dāng)てます。このプーリングは、メモリの小さなチャンクを頻繁に割り當(dāng)てたり割り當(dāng)て解除したりするオーバーヘッドを軽減するのに役立ちます。
  5. メモリの最適化: Python は、次のようなさまざまな最適化を適用してメモリ使用量を最小限に抑えます。
    • PVM は、一部の実裝 (PyPy など) でのジャストインタイム (JIT) コンパイルなど、効率を向上させるためにさまざまな実行時の最適化を?qū)g行します。
    • 小さな整數(shù)とインターンされた文字列を再利用します。
    • データ構(gòu)造 (タプル、リスト、辭書など) を効率的に管理します。

:

  • バイトコード キャッシュ: PVM は、毎回ソース コードを再コンパイルすることを避けるために、コンパイルされたバイトコードをキャッシュします。これにより、以降の実行が高速化されます。
  • 定數(shù)の折りたたみ: これには、実行時ではなくコンパイル時に定數(shù)式を簡素化することが含まれます。たとえば、3 * 2 は 6 に事前計算される可能性があります。

要約すると、PVM はオーケストラの指揮者のようなもので、バイトコードをコンピュータが実行できるアクションにシームレスに変換します。この素晴らしい點は、PVM のおかげで Python コードが移植可能であり、変更せずにさまざまなプラットフォームで実行できることです。

バイトコードが生成されたかどうかを確認するにはどうすればよいでしょうか?

Python モジュールをインポートすると、Python はソース コードをバイトコードにコンパイルし、__pycache__ ディレクトリに保存します。これにより、モジュールをインポートするたびに再コンパイルする必要がなくなり、今後のインポートが高速化されます。

プロセスは次のとおりです:

  • 最初のインポート: 初めてモジュールをインポートすると、Python は .py ファイルをバイトコードにコンパイルします。
  • pycache ディレクトリ: バイトコードは、 module_name.cpython-312.pyc のような名前の __pycache__ ディレクトリに保存されます。 #312 は Python のバージョンです。
  • 後続のインポート: 後続のインポートでは、Python はコンパイルされたバイトコードの __pycache__ ディレクトリをチェックし、ソース コードが変更されていない場合はそれを使用するため、インポート プロセスが高速化されます。

例:

byte.py があります。 byte.py の実行後に hello_world.py からコードをインポートすると、その特定のフォルダーに __pycache__ ディレクトリが存在し、.pyc ファイルが表示されることがわかります:

from hello_world import greet

greet("Byte code")


py_compile を使用する

py_compile モジュール。Python ソース ファイルをバイトコード ファイルにコンパイルできます。これは、將來のスクリプトの実行を高速化する便利な方法です。

byte.py內(nèi)

import py_compile

py_compile.compile('hello_world.py')

  • py_compile モジュールは hello_world.py をバイトコードにコンパイルします。
  • 結(jié)果のバイトコードは pycache ディレクトリに保存され、hello_world.cpython-38.pyc (または Python のバージョンに応じて同様のファイル) という名前のファイルが作成されます。

バイトコードの生成:

  • スクリプト全體が実行されてバイトコードが生成されます。これは、コンパイル プロセス中にトップレベルのコード (print("Hello, World!") や print("c") など) が実行されることを意味します。

結(jié)果のバイトコード:

  • バイトコードにはすべての関數(shù)、クラス、実行可能ステートメントが含まれており、Python はこれらを使用して今後のスクリプトのインポートを高速化します。

ディスモジュール

Python の dis モジュールは、バイトコードをより読みやすい形式に逆アセンブルするために使用されます。これは、Python コードが內(nèi)部で何を行っているかを理解するのに役立ちます。これは、Python の內(nèi)部をデバッグしたり學(xué)習(xí)したりする場合に特に役立ちます。

  • internal.py には次のものがあります
from hello_world import greet

greet("Byte code")


出力

import py_compile

py_compile.compile('hello_world.py')

  • プログラムは、CPython バイトコードを分析するための強力なツールである dis モジュールをインポートすることから始まります。 CPython は Python のデフォルト実裝であり、バイトコードは Python インタプリタの中間言語です。
  • 次に、greet という単純な関數(shù)を定義しました。この関數(shù)はパラメータ名を受け取り、挨拶を出力します。関數(shù)自體は非常に単純ですが、Python の內(nèi)部で起こっていることは、表面で見えるよりも複雑です。
  • disassemble_function 関數(shù)は、dis.dis() を使用して、greet 関數(shù)を逆アセンブルします。 dis.dis() は、Python 関數(shù)を、Python の仮想マシンが実際に実行する低レベルのバイトコードに変換します。このバイトコードはPythonによるgreet関數(shù)の解釈であり、マシンコードに一歩近づきます。
  • スクリプトが disassemble_function() を呼び出すと、コンソール出力には、greet 関數(shù)のバイトコードが表示されます。

バイトコードからわかることは次のとおりです:

  • LOAD_GLOBAL(0): このオペコードは、グローバル変數(shù) (この場合は print 関數(shù)) をロードするために使用されます。
  • LOAD_CONST(1): 定數(shù)値「Hello,」をスタックにロードします。
  • LOAD_FAST(0): このオペコードは、ローカル変數(shù)名をスタックにロードします。
  • FORMAT_VALUE(0): これは名前文字列をフォーマットし、これから構(gòu)築される文字列に挿入できるように準(zhǔn)備します。
  • BUILD_STRING(2): これはスタック上の上位 2 つの値 ('Hello,' と名前) を取得し、最終的な文字列を構(gòu)築します。
  • CALL_FUNCTION(1): この行は、括弧內(nèi)に引數(shù)の數(shù)を指定して関數(shù) (スタックにロードしたグローバル印刷関數(shù)) を呼び出します (引數(shù)は 1 つで、フォーマットされた文字列です)。
  • POP_TOP: スタックの最上位を削除します (print は None を返すため、前の呼び出しの結(jié)果)。
  • LOAD_CONST(0): ロードなし。
  • RETURN_VALUE: これは、greet 関數(shù)の戻り値です。明示的な return ステートメントがないため、None になります。
  • 本質(zhì)的に、バイトコードは、Python がgreet 関數(shù)を?qū)g行するために実行する個々の操作を示します。これらの指示を理解することは、Python がどのようにコードを?qū)g行し、関數(shù)を最適化し、リソースを管理するかを理解するために非常に重要です。これらすべては、Python コードを?qū)g行するときに內(nèi)部でシームレスに行われます。

これは、Python マシンルームへの楽しいダイビングではないでしょうか?コーディングを続けて、この言語のエンジン ルームの奧深くを探索し続けますか?!

以上がPython の內(nèi)部動作の詳細內(nèi)容です。詳細については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Pythonの不適格またはPytestフレームワークは、自動テストをどのように促進しますか? Pythonの不適格またはPytestフレームワークは、自動テストをどのように促進しますか? Jun 19, 2025 am 01:10 AM

Pythonの不適格でPytestは、自動テストの書き込み、整理、および実行を簡素化する2つの広く使用されているテストフレームワークです。 1.両方とも、テストケースの自動発見をサポートし、明確なテスト構(gòu)造を提供します。 pytestはより簡潔で、テスト\ _から始まる関數(shù)が必要です。 2。それらはすべて組み込みのアサーションサポートを持っています:Unittestはアサートエクイアル、アサートトルー、およびその他の方法を提供しますが、Pytestは拡張されたアサートステートメントを使用して障害の詳細を自動的に表示します。 3.すべてがテストの準(zhǔn)備とクリーニングを処理するためのメカニズムを持っています:un

Pythonは、NumpyやPandasなどのライブラリとのデータ分析と操作にどのように使用できますか? Pythonは、NumpyやPandasなどのライブラリとのデータ分析と操作にどのように使用できますか? Jun 19, 2025 am 01:04 AM

pythonisidealfordataanalysisduetonumpyandpandas.1)numpyexcelsatnumericalcompitations withfast、多次元路面およびベクトル化された分離likenp.sqrt()

動的なプログラミング技術(shù)とは何ですか?また、Pythonでそれらを使用するにはどうすればよいですか? 動的なプログラミング技術(shù)とは何ですか?また、Pythonでそれらを使用するにはどうすればよいですか? Jun 20, 2025 am 12:57 AM

動的プログラミング(DP)は、複雑な問題をより単純なサブ問題に分解し、結(jié)果を保存して繰り返し計算を回避することにより、ソリューションプロセスを最適化します。主な方法は2つあります。1。トップダウン(暗記):問題を再帰的に分解し、キャッシュを使用して中間結(jié)果を保存します。 2。ボトムアップ(表):基本的な狀況からソリューションを繰り返し構(gòu)築します。フィボナッチシーケンス、バックパッキングの問題など、最大/最小値、最適なソリューション、または重複するサブ問題が必要なシナリオに適しています。Pythonでは、デコレータまたはアレイを通じて実裝でき、再帰的な関係を特定し、ベンチマークの狀況を定義し、空間の複雑さを最適化することに注意する必要があります。

__iter__と__next__を使用してPythonにカスタムイテレーターを?qū)g裝するにはどうすればよいですか? __iter__と__next__を使用してPythonにカスタムイテレーターを?qū)g裝するにはどうすればよいですか? Jun 19, 2025 am 01:12 AM

カスタムイテレーターを?qū)g裝するには、クラス內(nèi)の__iter__および__next__メソッドを定義する必要があります。 __iter__メソッドは、ループなどの反復(fù)環(huán)境と互換性があるように、通常は自己の反復(fù)オブジェクト自體を返します。 __next__メソッドは、各反復(fù)の値を制御し、シーケンスの次の要素を返し、アイテムがもうない場合、停止例外をスローする必要があります。 statusステータスを正しく追跡する必要があり、無限のループを避けるために終了條件を設(shè)定する必要があります。 fileファイルラインフィルタリングなどの複雑なロジック、およびリソースクリーニングとメモリ管理に注意を払ってください。 simple単純なロジックについては、代わりにジェネレーター関數(shù)の収率を使用することを検討できますが、特定のシナリオに基づいて適切な方法を選択する必要があります。

Pythonプログラミング言語とそのエコシステムの新たな傾向または將來の方向性は何ですか? Pythonプログラミング言語とそのエコシステムの新たな傾向または將來の方向性は何ですか? Jun 19, 2025 am 01:09 AM

Pythonの將來の傾向には、パフォーマンスの最適化、より強力なタイププロンプト、代替ランタイムの増加、およびAI/MLフィールドの継続的な成長が含まれます。第一に、CPYTHONは最適化を続け、スタートアップのより速い時間、機能通話の最適化、および提案された整數(shù)操作を通じてパフォーマンスを向上させ続けています。第二に、タイプのプロンプトは、コードセキュリティと開発エクスペリエンスを強化するために、言語とツールチェーンに深く統(tǒng)合されています。第三に、PyscriptやNuitkaなどの代替のランタイムは、新しい機能とパフォーマンスの利點を提供します。最後に、AIとデータサイエンスの分野は拡大し続けており、新興図書館はより効率的な開発と統(tǒng)合を促進します。これらの傾向は、Pythonが常に技術(shù)の変化に適応し、その主要な位置を維持していることを示しています。

ソケットを使用してPythonでネットワークプログラミングを?qū)g行するにはどうすればよいですか? ソケットを使用してPythonでネットワークプログラミングを?qū)g行するにはどうすればよいですか? Jun 20, 2025 am 12:56 AM

Pythonのソケットモジュールは、クライアントおよびサーバーアプリケーションの構(gòu)築に適した低レベルのネットワーク通信機能を提供するネットワークプログラミングの基礎(chǔ)です?;镜膜蔜CPサーバーを設(shè)定するには、Socket.Socket()を使用してオブジェクトを作成し、アドレスとポートをバインドし、.listen()を呼び出して接続をリッスンし、.accept()を介してクライアント接続を受け入れる必要があります。 TCPクライアントを構(gòu)築するには、ソケットオブジェクトを作成し、.connect()を呼び出してサーバーに接続する必要があります。次に、.sendall()を使用してデータと.recv()を送信して応答を受信します。複數(shù)のクライアントを処理するには、1つを使用できます。スレッド:接続するたびに新しいスレッドを起動します。 2。非同期I/O:たとえば、Asyncioライブラリは非ブロッキング通信を?qū)g現(xiàn)できます。注意すべきこと

Pythonクラスの多型 Pythonクラスの多型 Jul 05, 2025 am 02:58 AM

Pythonオブジェクト指向プログラミングのコアコンセプトであるPythonは、「1つのインターフェイス、複數(shù)の実裝」を指し、異なるタイプのオブジェクトの統(tǒng)一処理を可能にします。 1。多型は、メソッドの書き換えを通じて実裝されます。サブクラスは、親クラスの方法を再定義できます。たとえば、Animal ClassのSOCK()方法は、犬と貓のサブクラスに異なる実裝を持っています。 2.多型の実用的な用途には、グラフィカルドローイングプログラムでdraw()メソッドを均一に呼び出すなど、コード構(gòu)造を簡素化し、スケーラビリティを向上させる、ゲーム開発における異なる文字の共通の動作の処理などが含まれます。 3. Pythonの実裝多型を満たす必要があります:親クラスはメソッドを定義し、子クラスはメソッドを上書きしますが、同じ親クラスの継承は必要ありません。オブジェクトが同じ方法を?qū)g裝する限り、これは「アヒル型」と呼ばれます。 4.注意すべきことには、メンテナンスが含まれます

Pythonでリストをスライスするにはどうすればよいですか? Pythonでリストをスライスするにはどうすればよいですか? Jun 20, 2025 am 12:51 AM

Pythonリストスライスに対するコアの答えは、[start:end:step]構(gòu)文をマスターし、その動作を理解することです。 1.リストスライスの基本形式はリスト[start:end:step]です。ここで、開始は開始インデックス(含まれています)、endはend index(含まれていません)、ステップはステップサイズです。 2。デフォルトで開始を省略して、0から開始を開始し、デフォルトで終了して終了し、デフォルトでステップを1に省略します。 3。my_list[:n]を使用して最初のnアイテムを取得し、my_list [-n:]を使用して最後のnアイテムを取得します。 4.ステップを使用して、my_list [:: 2]などの要素をスキップして、均一な數(shù)字と負のステップ値を取得できます。 5.一般的な誤解には、終了インデックスが含まれません

See all articles