亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Python の內(nèi)部動(dòng)作

Nov 04, 2024 pm 01:45 PM

Internal Working Of Python

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

1.ソースコード

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

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

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

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

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

Internal Working Of Python

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

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

トークン化:

  • コードをトークン (キーワード、演算子、識(shí)別子など) と呼ばれる小さな部分に分割します。
  1. ソース コード: 作成したコードから始まります。
  2. トークナイザー (Lexer): ソース コードを、キーワード (for、if)、演算子 ( 、 -)、識(shí)別子 (変數(shù)名)、リテラル (數(shù)値や文字列など) などのトークンと呼ばれる小さな部分に分割します。 .
  3. 解析: トークンを分析して、Python の構(gòu)文ルールに従っていることを確認(rèn)します。
  4. 構(gòu)文分析: パーサーはこれらのトークンを取得し、Python の文法規(guī)則と照合してチェックします。
  5. 解析ツリー: コードの文法構(gòu)造を表すトークンからツリー構(gòu)造を構(gòu)築します。
  6. セマンティック分析: データ型、スコープ、その他のコンテキスト固有のルールの観點(diǎn)からコードが意味をなしていることを確認(rèn)します。
  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)て: コードの実行時(shí)に、Python オブジェクト (整數(shù)、文字列、リストなど) がメモリ內(nèi)に作成されます。
  3. ガベージ コレクション: Python には、使用されなくなったメモリ (つまり、參照カウントがゼロのオブジェクト) の割り當(dāng)てを解除することでメモリの管理に役立つガベージ コレクタがあります。
  4. メモリ プーリング: Python はメモリのプールを使用して、小さなオブジェクトをより効率的に割り當(dāng)てます。このプーリングは、メモリの小さなチャンクを頻繁に割り當(dāng)てたり割り當(dāng)て解除したりするオーバーヘッドを軽減するのに役立ちます。
  5. メモリの最適化: Python は、次のようなさまざまな最適化を適用してメモリ使用量を最小限に抑えます。
    • PVM は、一部の実裝 (PyPy など) でのジャストインタイム (JIT) コンパイルなど、効率を向上させるためにさまざまな実行時(shí)の最適化を?qū)g行します。
    • 小さな整數(shù)とインターンされた文字列を再利用します。
    • データ構(gòu)造 (タプル、リスト、辭書など) を効率的に管理します。

:

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

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

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

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 バイトコードを分析するための強(qiáng)力なツールである 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行するために実行する個(gè)々の操作を示します。これらの指示を理解することは、Python がどのようにコードを?qū)g行し、関數(shù)を最適化し、リソースを管理するかを理解するために非常に重要です。これらすべては、Python コードを?qū)g行するときに內(nèi)部でシームレスに行われます。

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

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

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、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

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

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

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

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

Pythonジェネレーターと反復(fù)器を説明します。 Pythonジェネレーターと反復(fù)器を説明します。 Jul 05, 2025 am 02:55 AM

イテレータは、__iter __()および__next __()メソッドを?qū)g裝するオブジェクトです。ジェネレーターは、単純化されたバージョンのイテレーターです。これは、収量キーワードを介してこれらのメソッドを自動(dòng)的に実裝しています。 1. Iteratorは、次の()を呼び出すたびに要素を返し、要素がなくなると停止例外をスローします。 2。ジェネレーターは関數(shù)定義を使用して、オンデマンドでデータを生成し、メモリを保存し、無限シーケンスをサポートします。 3。既存のセットを処理するときに反復(fù)器を使用すると、大きなファイルを読み取るときに行ごとにロードするなど、ビッグデータや怠zyな評(píng)価を動(dòng)的に生成するときにジェネレーターを使用します。注:リストなどの反復(fù)オブジェクトは反復(fù)因子ではありません。イテレーターがその端に達(dá)した後、それらは再作成する必要があり、発電機(jī)はそれを一度しか通過できません。

PythonでAPI認(rèn)証を処理する方法 PythonでAPI認(rèn)証を処理する方法 Jul 13, 2025 am 02:22 AM

API認(rèn)証を扱うための鍵は、認(rèn)証方法を正しく理解して使用することです。 1。Apikeyは、通常、リクエストヘッダーまたはURLパラメーターに配置されている最も単純な認(rèn)証方法です。 2。BasicAuthは、內(nèi)部システムに適したBase64エンコード送信にユーザー名とパスワードを使用します。 3。OAUTH2は、最初にclient_idとclient_secretを介してトークンを取得し、次にリクエストヘッダーにbearertokenを持ち込む必要があります。 4。トークンの有効期限に対処するために、トークン管理クラスをカプセル化し、トークンを自動(dòng)的に更新できます。要するに、文書に従って適切な方法を選択し、重要な情報(bào)を安全に保存することが重要です。

Pythonの主張を説明します。 Pythonの主張を説明します。 Jul 07, 2025 am 12:14 AM

Assertは、Pythonでデバッグに使用されるアサーションツールであり、條件が満たされないときにアサーションエラーを投げます。その構(gòu)文は、アサート條件とオプションのエラー情報(bào)であり、パラメーターチェック、ステータス確認(rèn)などの內(nèi)部ロジック検証に適していますが、セキュリティまたはユーザーの入力チェックには使用できず、明確な迅速な情報(bào)と組み合わせて使用??する必要があります。例外処理を置き換えるのではなく、開発段階での補(bǔ)助デバッグにのみ利用できます。

一度に2つのリストを繰り返す方法Python 一度に2つのリストを繰り返す方法Python Jul 09, 2025 am 01:13 AM

Pythonで2つのリストを同時(shí)にトラバースする一般的な方法は、Zip()関數(shù)を使用することです。これは、複數(shù)のリストを順番にペアリングし、最短になります。リストの長さが一貫していない場合は、itertools.zip_longest()を使用して最長になり、欠損値を入力できます。 enumerate()と組み合わせて、同時(shí)にインデックスを取得できます。 1.Zip()は簡潔で実用的で、ペアのデータ反復(fù)に適しています。 2.zip_longest()は、一貫性のない長さを扱うときにデフォルト値を入力できます。 3. Enumerate(Zip())は、トラバーサル中にインデックスを取得し、さまざまな複雑なシナリオのニーズを満たすことができます。

Python Iteratorsとは何ですか? Python Iteratorsとは何ですか? Jul 08, 2025 am 02:56 AM

inpython、iteratoratorSareObjectsthatallopingthroughcollectionsbyimplementing __()and__next __()

Pythonタイプのヒントとは何ですか? Pythonタイプのヒントとは何ですか? Jul 07, 2025 am 02:55 AM

タイプヒントシンパソコンの問題と、ポテンシャルを使用して、dynamivitytedcodedededevelowingdeexpecifeedtypes.theyenhanceReadeadability、inableearlybugdetection、およびrequrovetoolingsusingsupport.typehintsareadddeduneadddedusingolon(:)

Python Fastapiチュートリアル Python Fastapiチュートリアル Jul 12, 2025 am 02:42 AM

Pythonを使用して最新の効率的なAPIを作成するには、Fastapiをお?jiǎng)幛幛筏蓼埂?biāo)準(zhǔn)のPythonタイプのプロンプトに基づいており、優(yōu)れたパフォーマンスでドキュメントを自動(dòng)的に生成できます。 FastAPIおよびASGIサーバーUVICORNをインストールした後、インターフェイスコードを記述できます。ルートを定義し、処理機(jī)能を作成し、データを返すことにより、APIをすばやく構(gòu)築できます。 Fastapiは、さまざまなHTTPメソッドをサポートし、自動(dòng)的に生成されたSwaggeruiおよびRedocドキュメントシステムを提供します。 URLパラメーターはパス定義を介してキャプチャできますが、クエリパラメーターは、関數(shù)パラメーターのデフォルト値を設(shè)定することで実裝できます。 Pydanticモデルの合理的な使用は、開発の効率と精度を改善するのに役立ちます。

See all articles