tea-e7n.dev

Python 3.15でlazy importとやらが生えるらしい

Python 3.15でlazy importという仕組みが実装されるらしいので、これについてサクッと見ていきます。

lazy importとは

そのままではありますが、日本語だと遅延インポートと表現できます。

なにがlazyかというと、importしたモジュールを利用するところで初めてimportされる、という意味合いでlazyとされています。遅延評価みたいなものですね。

大規模なPythonアプリケーションでは、たくさんのimport対象のモジュールが先頭でロードされますが、その際に発生するファイル読み込みやコード実行により本丸の処理の起動が遅くなることがあります。 そういうときに、importを必要な場面まで遅延させることで起動を高速化できる、というのが嬉しい点です。

使ってみる

Python 3.15は2026-10-01にリリース予定ということで正式版は利用できないので、RC版を利用します。 今回はDocker環境を利用して検証を行いました。 Dockerだと、次のimageを利用することでlazy importの機能を体験できます。

FROM python:3.15.0rc2-slim-trixie
...

まずはimportして利用するための適当なファイルを定義します。

import time

print("report: initializing", flush=True)
time.sleep(1)

def generate():
    print("report generated", flush=True)

まずはlazy importを利用しない形で、通常のimport方式での基本動作を確認しておきます。

import report

print("準備完了")
print("1回目")
report.generate()
print("2回目")
report.generate()

結果は次のようになります。 importが一番初めに走るので、reportのinitial処理が先行して、その後にmainの処理が実行されるという形になります。

report: initializing
準備完了
1回目
report generated
2回目
report generated

次に、lazy importを利用して同様の処理を書いてみます。

lazy import report

print("準備完了")
print("1回目")
report.generate()
print("2回目")
report.generate()

結果は次のようになります。 先ほどとは異なり、reportのinitialの位置が1回目のgenerate()実行位置に移動していることがわかります。確かに、importが遅延しています。

準備完了
1回目
report: initializing
report generated
2回目
report generated

ちなみに、lazy importを利用しなくとも同様の挙動自体はこれまでも実現することができました。 Pythonは関数内importが可能な言語なので、次のように関数の中にimportを閉じ込めてあげるだけで、関数の実行時までimportを遅延させることができます。

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について簡単に確認しました。

既存のアプリケーション実装に取り入れる場合には少々注意が必要なものの、積極的に採用していきたい代物ではないだろうかと思いました。