Python の非同期化に取り組んでいます

2026/09/02 3:44

Python の非同期化に取り組んでいます

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

Python 3.15a7 は PEP 810 を導入し、

lazy import <module>
のような構文や、後方互換性のリスト宣言(
__lazy_modules__ = [...]
)を通じて遅延インポートを可能にします。これにより、未使用のモジュールはアクセスされるまで読み込まれず、CLI ツールのパフォーマンスが劇的に向上します;ベンチマークでは
--help
などの単純なコマンドで最大 2 倍の高速化が確認され、
repo-review
(3 倍)や
cibuildwheel
ではさらに大きな改善が見られます。環境フラグ(
-X lazy_imports=all
PYTHON_LAZY_IMPORTS=all
)を使用してすべてのインポートを遅延とみなすことも可能ですが、これは主にテスト目的です。すべてのモジュールを遅延としてマークすべきではありません;インポート時またはトップレベルアクセスに副作用があるもの(例:
re.compile
)はエラーを避けるため、積極的ロードされたままにしておく必要があります。
flake8-lazy
ツールは、欠落した遅延宣言を発見し、Python 3.15+ の構文に対して
__lazy_modules__
リストを検証するのを支援します;使用されるエラーコードには、LZY1xx(宣言の不足)、LZY2xx(リスト検証)、LZY3xx(ネイティブキーワードとの競合)、LZY4xx(セマンティック安全性チェック)があります。AI ツールを使用して
flake8-lazy
が開発され、開発者は手動で 5% 未満のコードしか書かず、
AGENTS.md
のようなパターンのサポートを受けています。高度な使用法には、自動修正(
uvx flake8-lazy --apply=list
)および
--format=lazy-modules
出力を消費する AI モデルが含まれます。追加の最適化には、
TYPE_CHECKING = False
を使用して
TYPE_CHECKING
を避けることがあり、これは Ruff チェック(TID251)がサポートするパターンです。制限事項には、相対インポートに関する曖昧さ(
a.b
対型)および CPython 3.15 ワheel でまだコンパイルされていないライブラリとの互換性の問題が含まれます。将来の改善は、サードパーティライブラリが遅延インポートを採用するにつれて期待されており、
hyperfine
-X importtime
を使用して測定されます。

本文

Python 3.15 と AI を活用した「怠惰型インポート」の劇的パフォーマンス向上

Python 3.15a7 では、

uv
を用いたインストール環境においてついに**「怠惰型インポート(Lazy Imports)」**機能を実装しました。この PEP 810 で提案された画期的な機能は、CLI アプリケーション(特に
--help
などを使用する際)の起動時間を劇的に高速化します。大量のインポートが必要で大規模コードであっても、以前失敗した試みとは異なり、今回はライブラリ側の対応が必要です。

以下に「怠惰型インポートとは」「活用方法」「ツール紹介」、そして「AI を多用して開発した体験」をまとめました。

まとめ(TL;DR):

uvx flake8-lazy --apply=list
を実行し、Python 3.15 でコードを魔法のように高速化しましょう!


怠惰型インポートとは?

標準的な Python の CLI ファイルでは、コマンド引数を解析する前にすべての依存モジュールがインポートされることがあります。

従来の問題点

argparse
numpy
をインポートしただけでも処理が発生します。

import argparse
import numpy


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--foo", action="store_true")
    args = parser.parse_args()
    if args.foo:
        print(numpy.array([1, 2, 3])) # ここまで処理しない限り numpy は不要
  • --help
    フラグ実行時
    :
    numpy
    のインポートが発生しますが、実際のロジックには関与しません。
  • uv
    環境での影響
    :
    uv
    はデフォルトでバイトコードの事前コンパイルを行いません(明示的指示がない場合)。これによりインストールは速くても、最初のインポート処理が遅延してしまいます。

この問題はパッケージ化されたライブラリでも同様です。

# __init__.py
from . import a
from . import b
__all__ = ["a", "b"]
  • import lib
    だけで利用できるようにしたいが、
    lib.a.stuff
    を使う必要がある場合。
  • すべてのインポートされたモジュールを使わなくても、コストは発生してしまいます。
    • rich
      は明示的なインポートを推奨する一方、古いライブラリではこのパターンが一般的です。

解決策:怠惰型インポート(Python 3.15)

Python 3.15 では、以下のように記述できるようになりました。

lazy import argparse
lazy import numpy

def main():
    parser = argparse.ArgumentParser()
    # ...
  • 動作: インポート時に何の処理も行われません。モジュール自体もインストールされていなくても問題ありません。
  • 活性化: 初めてそのオブジェクトを使用するタイミングで、真にインポートされたオブジェクトへと変換されます。
    • --help
      を実行した場合は
      numpy
      のインポートすら行われず、劇的に高速化します。

後方互換性のある構文

古い Python バージョンでも動作する別の方法もあります。

__lazy_modules__ = ["argparse", "numpy"]
import argparse
import numpy
  • これにより古いバージョンでの動作も保証されます(ただし、単に「怠惰型」ではない点に注意)。
  • リンター(例:
    Ruff
    )もこの配置を許容し、違反を検出しないよう更新されています。

補足: Python には全インポートを怠惰型にするフラグ

-X lazy_imports=all
もありますが、主にテスト用途で使用されます。


なぜすべてのモジュールを怠惰型にできないのか?

一部のモジュールはインポート時に副作用(初期化処理など)を持つためです。この副作用が直後に発生する必要がある場合は怠惰型化できません。

怠惰型化できないパターン

エラーハンドリングが必要な場合などは、単純な

lazy import
は機能しません。

try:
    import numpy
except ModuleNotFoundError:
    ... # ここに処理を移す必要があります

代替案:部分的に怠惰なアプローチ

import importlib.util

if importlib.util.find_spec("numpy") is None:
    ... # 不足している場合の処理

lazy import numpy
  • 欠点: インポートを行わない場合よりわずかにコストがかかります。
  • 注意点: サブパッケージへのアクセス時に、トップレベルのインポートが発生します。また、エラーメッセージの内容も限定的です。

定数やトップレベルの使用

ファイル処理などトップレベルで常に必要とするライブラリ(例:

re
)は怠惰型にする意味がありません。ただし、キャッシュを活用することで回避できます。

import functools
lazy import re

@functools.cache
def regex() -> re.Pattern:
    return re.compile(...) # 必要な時にのみインポート・コンパイル

この機能を使うには

from __future__ import annotations
は必須ではありません(Python 3.14 より注釈がデフォルトで怠惰型化するため)。ただし、エラーを意図的に先送りするだけの場合は推奨されません。

ファイル全体を怠惰型にする場合

class AllLazy:
    @staticmethod
    def __contains__(_: str) -> bool:
        return True


__lazy_modules__ = AllLazy()

flake8-lazy: 管理と最適化のためのツール

ライブラリが

__lazy_modules__
を追加するには複雑な考慮が必要です。そこで開発されたヘルパーツールです。
flake8-lazy
は、正確に何を追加すべきかを判断し、コードを整理します。

使用方法

コマンド説明
uvx flake8-lazy <ファイル>
エラー表示: 怠惰型宣言の不足などを報告します。
uvx flake8-lazy --format=lazy-modules
提案表示: 追加すべき行を表示します。
uvx flake8-lazy --apply=list <ファイル>
自動修正: リスト形式で即座にコードを修正します。
# pipx を使用する場合も同様
pipx run flake8-lazy --apply=list <filenames>

エラーコードの概要

  • Code 1xx: 怠惰型宣言の欠如
    • トップレベルで使用されていない標準ライブラリやサードパーティライブラリがリストされていない場合。
  • Code 2xx:
    __lazy_modules__
    の検証
    • ソート未実施、重複、割り当て順序の誤り、絶対名指定など。
  • Code 3xx: ネイティブ怠惰型キーワード (Python 3.15+)
    • Python 3.15 以降の新構文特有の問題を検出。
  • Code 4xx: セマンティクスと安全性
    • トップレベルでアクセスされるのに怠惰型化されている、パッケージ固有のルール違反など。

成果:劇的な速度向上

自身のソースコードや主要プロジェクトに適用した結果、

--help
フラグを含む処理が大幅に高速化されました。

パッケージBefore (ms)After (ms)Speedup備考
flake8-lazy100+ ms50 ms2xオリジナル版の向上
repo-review113 ms35 ms3xPR 提出物
cibuildwheel179 ms61 ms3xPR 提出物
build50 ms45 ms10%もともと高速のため変化较小
packagingN/AN/AN/A
--help
なし
  • M1 マシンでの Python 起動: 約 15 ミリ秒。これより速くすることはできません(標準ライブラリのロードなど)。
  • 測定ツール:
    hyperfine
    -X importtime
    を使用して詳細な計測が可能です。
  • 将来性: サードパーティライブラリも怠惰型インポートを追加すれば、さらに改善が期待されます。

課題:

  • エッジケース(例:
    dataclasses
    のタイプヒント解析など)で正しく動作しない場合があります。不足している処理を過剰に補うより、慎重に対応すべきです。
  • 一部のモジュール(
    numpy
    など)はまだ CPython 3.15 向けホイールが正式リリースされておらず、最大の効果が確認できない段階です。

AI を多用した開発体験

このプロジェクトは、AI ツールを多大に活用した最初の成功事例の一つです(保守支援の

plumbum
以降)。

開発プロセスと成果

  • 速度: 手作業の場合の数日かかる作業を、約 1 日で完成しました。実装の詳細を追跡するのではなく、指示に基づき動作を確認・修正するスタイルでした。
  • 品質: コードは少し長くなる傾向(重複除去)がありますが、全体としてクリーンで人間らしく見えます。
  • リファクタリング: エージェントはプロンプトなしでテスト生成やエラー処理、マージ競合の解決などを完璧に行いました。

技術スタックと構成

AI の成功には、強力なセットアップが寄与しました。

  • テンプレート: Scientific Python Development Guide をベース。
  • ツール:
    uv
    ,
    prek
    ,
    nox
    の自動利用設定(
    AGENTS.md
    など)。
  • リンター:
    Ruff
    (TID251 チェックなど)。
  • LLM モデル: GPT-5.3-codex が主体で、Claude Sonnet 4.6 が選択される場合あり。

AI の具体的な活躍例

  • コード修正: エラーメッセージの改善や、例外注釈のバージョン適合(Python 3.11 ゲートなど)。
  • ドキュメント管理: README とドキュメント間の重複解消。
  • 複雑なリファクタ: 長い
    __init__.py
    の再設計(
    __lazy_modules__
    の再適用含む)を完璧に実行。
  • テスト作成: プロンプトなしで追加された機能に対するテストコードを生成。

結論:AI と人間の役割分担

  • 人間: 要件定義、高レベルなアーキテクチャ決定(ライブラリ設計など)、最終的な品質判断。
  • AI: 実装の詳細作業、繰り返し処理、テスト作成、ループ処理の高速化。

このように「待つ」ことさえできれば、開発スピードは手書きの5〜7 倍に近づく可能性があります。適切なリンティングとテスト設定があれば、AI は非常に強力なヘルパーになります。

同じ日のほかのニュース

一覧に戻る →

2026/09/04 3:32

Cerebras に Qwen 3.8 27B が登場、1500 トokens/秒で提供中

## Japanese Translation: Cerebras の公開エンドポイントは、無料トライアルおよび従量課金プランの両方で、オープンソースモデルの元の未トリミングバージョンを独占的にホストし、最高の品質と透明性を保証します。多くのサービスがデータを静かに圧縮するのに対し、Cerebras はストレージ効率とアーキテクチャの完全性の厳格な分離を行います。ウェイトは 4 ビットや 8 ビットの低位精度形式で保存してスペースを節約しますが、機密性が高い層はフルプレシジョンで保存され、オンザフライでのデクアンタ化が行われるため、演算は高精度で行われます。重要なのは、処理中에도活性化、注意機構、および kv キャッシュが精度低下やクアンタ化を行わずにフルプレシジョンのまま保たれ、数値誤差を防ぐことです。プラットフォームは、「クアンタ化」を単にストレージのためにデータの精度を下げずアーキテクチャを変更しないものと、「トリミング」をモデルのアーキテクチャの一部を永続的に削除するものとして区別します。REAP テクニクスを使用するようなトリミングされたモデルは、Cerebras REAP Collection という名前の Hugging Face などのプラットフォーム上で研究用としてのみ提供され、生产サービスとは決して混在させられません。Cerebras が将来の圧縮手法を検討する場合、既存のエンドポイントを改変するのではなく、明確な命名規則を持つ別々のエンドポイントとして展開します。したがって、この API を利用する開発者は、背後にあるモデル構造に対する隠れた妥協や予期せぬ変化なしに一貫した高忠実度のパフォーマンスを受け取り、品質が実験的な目標のために決して犠牲にされないことを保証されます。

2026/09/03 23:54

ドメイン名の廃止

## 日本語訳: Verisign は、2026 年 2 月までに「.name」トップレベルドメイン階層全体を廃止する計画を持っており、登録有効期限が 2040 年以降とされるにもかかわらず、同意なくかつ補償なしに約 2 万 2,000 人のユーザーのインターネットサービスを実質的に停止します。この劇的な措置は、Verisign がグローバルネームレジストリを收购した後、ICANN で正式に承認されました(2026 年 7 月 28 日)。著者は、廃止案への信頼不足および非道徳的な姿勢がこの決断の主要な要因であると指摘しています。直後の影響により、個人ウェブサイト(例:`neil.fraser.name`)、メールアドレス(例:`beverly.fraser.name`)、IoT デバイスを含む重要なインフラが一夜にして機能を停止します。削除後、空いた第二レベルドメインは、認証情報を利用した自動ボットによって即時に乗っ取られる危険性に直面します。主な危険はデータ損失だけでなく、何千もの個人が同時に自分のデジタルアイデンティティの支配権を失うことにより生じる体系的な脆弱性まで及びます。

2026/09/04 8:00

AI 時代におけるエンジニアのスキル保護

## 日本語訳: この文章は、原子力発電所とソフトウェアの両方で完全自律システムが導入された結果、人間のオペレーターにおける不可欠な「マニュアル」技能が侵食され、危害をもたらしたことを論じている。最も重要な点は、自動化が優位になる際にも技術の退廃を防ぐために、意図的かつ実践的な訓練を保持することが極めて重要であるということだ。ハーバード大学、スタンフォード大学、ニューヨーク連邦準備制度理事会(NY Fed)の証拠は、生成 AI の採用により若手雇用の減少が既に起きていることを示しており、これは部分的には遠隔勤務がメンターシップを断ち切ったため、企業がい経験のない労働者の訓練を行わなくなったことに起因している。このリスクは、自動化によって条件付けられたパイロットたちが機体の致命的な故障時にマニュアル操縦で飛行機を救えず、エア・フランス 447 号機の墜落事故という悲劇的な事例で示された。政治的 reason よりも提案された原子力発電所計画が頓挫した一方で、航空業界は乗組員がマニュアル飛行の技能を実践し続けるために、燃料効率を犠牲にすることを要求することで対応した。将来の危機を防ぐために、研究者たちは AI ワークフローにおける「マニュアルゲート」の導入を提唱しており、これは自動化された支援を受ける前に人間が特定の技能を発揮することを強いるものである。このような構造化された中断なしには、AI が単独で解決できない複雑な状況に対処するために必要な基盤的な専門知識を失うリスクがあり、その結果、以前数年間の経験がないままにエントリレベルの役割を果たすことが不可能になる可能性がある。

Python の非同期化に取り組んでいます | そっか~ニュース