--- title: "Python 3.15でlazy importとやらが生えるらしい" description: "Python 3.15で導入されるlazy importの動作を、通常のimportや関数内importと比較して確認します。起動処理を高速化できる仕組みと、導入時の注意点を紹介します。" createdAt: "2026-09-09" tags: [Python] --- Python 3.15で[lazy import](https://docs.python.org/3.15/whatsnew/3.15.html#whatsnew315-lazy-imports)という仕組みが実装されるらしいので、これについてサクッと見ていきます。 ## lazy importとは そのままではありますが、日本語だと遅延インポートと表現できます。 なにがlazyかというと、importしたモジュールを利用するところで初めてimportされる、という意味合いでlazyとされています。遅延評価みたいなものですね。 大規模なPythonアプリケーションでは、たくさんのimport対象のモジュールが先頭でロードされますが、その際に発生するファイル読み込みやコード実行により本丸の処理の起動が遅くなることがあります。 そういうときに、importを必要な場面まで遅延させることで起動を高速化できる、というのが嬉しい点です。 ## 使ってみる [Python 3.15は2026-10-01にリリース予定](https://peps.python.org/pep-0790/)ということで正式版は利用できないので、RC版を利用します。 今回はDocker環境を利用して検証を行いました。 Dockerだと、次のimageを利用することでlazy importの機能を体験できます。 ```dockerfile title=Dockerfile FROM python:3.15.0rc2-slim-trixie ... ``` まずはimportして利用するための適当なファイルを定義します。 ```python title=report.py import time print("report: initializing", flush=True) time.sleep(1) def generate(): print("report generated", flush=True) ``` まずはlazy importを利用しない形で、通常のimport方式での基本動作を確認しておきます。 ```python title=main.py import report print("準備完了") print("1回目") report.generate() print("2回目") report.generate() ``` 結果は次のようになります。 importが一番初めに走るので、reportのinitial処理が先行して、その後にmainの処理が実行されるという形になります。 ```plain report: initializing 準備完了 1回目 report generated 2回目 report generated ``` 次に、lazy importを利用して同様の処理を書いてみます。 ```python lazy import report print("準備完了") print("1回目") report.generate() print("2回目") report.generate() ``` 結果は次のようになります。 先ほどとは異なり、reportのinitialの位置が1回目のgenerate()実行位置に移動していることがわかります。確かに、importが遅延しています。 ```plain 準備完了 1回目 report: initializing report generated 2回目 report generated ``` ちなみに、lazy importを利用しなくとも同様の挙動自体はこれまでも実現することができました。 Pythonは関数内importが可能な言語なので、次のように関数の中にimportを閉じ込めてあげるだけで、関数の実行時までimportを遅延させることができます。 ```python def run(): import report report.generate() print("準備完了") print("1回目") run() print("2回目") run() ``` でも遅延importの実現のために関数内importを使おうみたいなのを多用し始めるとコードの治安が悪くなってしまいそうなので、あまり積極的に使いたいものではないのかなと思っています。 そのため、従来のファイルのトップレベルでのimportに対してlazyと付けるだけでimportを遅延できるというのは、単純なスタートアップの高速化だけではなくてコードの可読性的な観点でも嬉しいところがあると思います。 ## lazy importのデメリット lazy importについていいところは大体わかったと思うので、一応デメリットも書いておきます。 - モジュール読み込み時の処理でエラーが発生する場合には、読み込みまでそれに気がつくことができない - lazy import対象のモジュール読み込みまでに時間のかかる処理が走って、import時にエラーになるみたいなことが起こり得るので注意する必要がある - 先頭でのimportに伴う処理が前提となっている場合、lazy importにすることで破綻してしまう可能性がある といった感じで、急にlazy importにすることで罠っぽい挙動を踏んでしまうことがあり得るので、従来のimportをテストなど無しにいきなり全てlazy importにするみたいなのは避けたほうがいいだろうなと思います。 ## まとめ Python 3.15で実装されるlazy importについて簡単に確認しました。 既存のアプリケーション実装に取り入れる場合には少々注意が必要なものの、積極的に採用していきたい代物ではないだろうかと思いました。