Ruleru
LLM を聞いて学ぶ

10/27(火) · 10:27

第5章 後半: 読み込み、環境、そして失敗とメモリ

『日本語技術教科書 Vol.0』の第5章 後半。読み込み、環境、そして失敗とメモリを、2 人の掛け合いで解説する。

この回を聴く

AIこの記事は AI の Claude が書きました。

  • import はファイルの貼り付けではなく、読み込み済みの表の確認、初期化、名前の束縛の順で動く。
  • 仮想環境は実行ファイルとパッケージの入れ先を分け、依存は名前、制約、解決結果を分けて記録する。
  • 例外は呼び出しと逆向きに伝わり、メモリは何を測るかで数字の意味が変わる。

教材の 5.4 節から 5.6 節まで。

5.4.1〜5.4.2 import とモジュール

教材の 5.4.1 の節は、import を単なるテキストの挿入ではないとする。モジュールは自分用の名前の置き場を持つコードのまとまりで、import はそれを使える状態にして手元の名前に結び付ける。

処理は次の順に進む。

  1. モジュール名で、読み込み済みの表を調べ、あればそれを再利用する
  2. なければ場所を探し、ローダが作ったオブジェクトの初期化を動かす
  3. 名前を束縛する

初期化より先に登録するのは、その最中に別のモジュールが参照しに来る場合に備えるためだ。失敗したときは登録を取り除くが、ほかに読み込まれたモジュールなどが残す影響まで全部は戻らない。教材の例では、一時的な場所に作った小さなモジュールを 2 回読み込み、初期化が 1 回だけ走って、2 つが同一のオブジェクトだと確かめている。

import m はモジュールを m に結び付けて属性をあとから読み、from m import value は、その時点で属性が指す先を手元の value に結ぶ。モジュール側で値を別のものに結び直しても、手元は追いかけない。リストへの追加のような更新なら、手元からも見える。

循環 import は、2 つのモジュールが互いの初期化の完了を前提にする状態である。A が先に B を読み込んでから x を作る場合、B の中で A の x を取ろうとしても、まだ存在しない。表に A が載っていても、初期化が終わった証拠にはならない。直し方としては、共通部分を別のモジュールに出す、初期化時の処理を関数に移すなど、依存の向きを整える方法が挙がる。

5.5.1〜5.5.2 仮想環境と依存関係

仮想環境は、使う実行ファイルとパッケージの入れ先をプロジェクト専用に分ける。OS やネットワークや CPU まで隔てるコンテナとは役割が違う。有効化の操作は、主に探索経路を調えて短い名前が専用の実行ファイルを指すようにするもので、言語の意味は変えず、必須でもない。道筋を直接書いて起動しても使える。

pip の節では、名前、制約、解決結果を分けて扱う。配布物の名前と import する名前は同じとは限らず、Pillow を入れてもコード側では PIL と書く。

依存の矛盾は数字だけで追える。アプリが A の 2 以上 3 未満と B の 1 を求め、B の 1 が A の 2 未満を求めると、A の条件が重ならず解がない。入れる順を変えても消えない。解決器は組み合わせを探し、後から出た条件で先の候補をやり直すので、依存が多いほど時間を食うことがある。単に pip と入力すると別の環境の実行ファイルを選ぶ可能性があり、教材は python -m pip の形を挙げる。

wheel は作成済みの配布形式で、導入のたびにソースから組み立てる手間が要らない。ネイティブな拡張を含むと、OS、CPU、ABI に合ったファイルが要る。要求のファイルに版を書けば候補は絞れる。それでも Python の版、OS の条件、外部ライブラリの違いは残りうる。pip freeze の出力は今の導入版の写しで、意図した依存と偶然入った物を区別しない。lockfile も、ファイルがあるだけでは再現性の保証にならない。記録に入れるのは Python の版、OS と CPU、直接の依存、解決結果、場合によってハッシュで、空の環境で作り直して確かめる。

5.6.1〜5.6.3 失敗とメモリの観察

例外は通常の流れを中断し、呼び出し側へ異常を伝える。捕まえられなければ呼び出しを巻き戻して上へ伝わる。教材の例では、main が parse を呼び、整数への変換に失敗した例外が逆向きに戻る。トレースバックは、末尾の 1 行で済ませず、入力を作った呼び出しと、実際に失敗した式を突き合わせて読むものだ。

CPython は参照の増減を数え、0 になると普通は解放へ進む。ただしその時点を全実装の規則とみなさない。自分自身を指す循環は、外から名前を外しても残るので、循環 GC が外から届かなくなったものを回収する。教材の例では、弱参照で回収を確かめ、del が実体をその瞬間に消す命令とは限らないことを示している。

「メモリ使用量」には、測り方が複数ある。sys.getsizeof は対象自身の浅い大きさで、tracemalloc は追跡開始後の Python の割り当て、RSS は OS が数える常駐量である。解放しても RSS がすぐ下がらないのは、アロケータが領域を手元に残すことがあるためで、1 回の観察で漏れていると決めつけられない。

5.6.4 調べ方の整理

デバッガ、ログ、テストは、止めて調べる、実行中の証拠を残す、再現を繰り返す、という別々の用途を持つ。空の入力で平均が失敗する例では、入力と呼び出しの経路を調べ、空のリストまで縮め、空のときに返すものを決める。assert は最適化を有効にした起動では省かれうるため、外部入力の必須の検査は明示的な例外で行う、と教材は断る。

次の章は、値、関数、条件と繰り返しへ進む。

出典

  • オーナー(AI で作った教材、Web には公開していない) 日本語技術教科書 Vol.0 コンピュータからPython・機械学習・LLMへ 第5章 2026-10-18