Python:最適化の階段

(タイトルのみ)

2026/03/11 4:22

Python:最適化の階段 (タイトルのみ)

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

要約

Japanese Translation:

Python の純粋な計算速度は、典型的なベンチマーク(n‑body 177×、spectral‑norm 875×)で Apple M4 Pro 上において C に比べて 100–875 倍遅く動作します。
この低下は Python の動的ディスパッチ、整数あたり約 28 バイトのオーバーヘッド、および GIL(グローバルインタプリタロック)の参照カウント処理に起因し、GIL 自体は単一スレッドコードを悪化させません。

最近の CPython リリースでは小規模な改善が見られます:
3.10→3.11 で適応型特殊化による約 1.4 倍の速度向上。
3.13 は軽量 JIT を追加しますが、まだメリットは確認されていません。
free‑threaded モード(3.14t)は実際に単一スレッドプログラムを遅くします。

ギャップを埋めるための選択肢はいくつかあります:

  • ランタイム代替案

    • PyPy / GraalPy:コード変更なしで 6–66 倍高速化。ただし JVM/JIT のウォームアップにより起動が遅く、エコシステムサポートは限定的。
    • Codon、Mojo nightly、Taichi:26–198 倍の利得がありますが、完全なリライトや古い CPython バージョンが必要です。
  • コンパイル済み拡張

    • mypy‑c(型付き Python → C):2.4–14 倍の速度向上。型アノテーションが必要で、機能は限定的に最適化されます。
    • Rust/PyO3:113–154 倍、特にデータパイプライン全体をネイティブで処理する場合(例:JSON パース)。
    • Cython:開発者が C 構文を採用し、型アノテーションを書き、** 演算子や cdivision の欠如、事前計算インデックスなどの落とし穴を回避すると 99–124 倍。
  • 加速ライブラリ

    • NumPy:BLAS を通じてベクトル化可能な行列-ベクトルワークロードで最大 520 倍。順序性や小規模配列には効果がありません。
    • JAX JIT:lax.fori_loop と lax.cond を用いて再構築した配列プログラムで最大 1 633 倍。関数型コードが必要です。
    • Numba @njit:NumPy 配列上でコンパイルすると 56–135 倍。一般的な Python オブジェクトや文字列には苦戦します。

実際のワークロード(約 100 k JSON イベント)では、最も達成可能な速度向上は、json.loads() による Python 辞書生成を回避したネイティブ Rust または Cython パーサーを使用することで約 6.3 倍です。適切なツールを選択すると、データ集約型、科学的、およびパフォーマンスクリティカルなアプリケーションの実行時間を劇的に短縮できます。

Text to translate

(incorporating all key points):**

Python’s pure‑compute speed lags behind C by 100–875× on typical benchmarks
(n‑body 177×, spectral‑norm 875×) run on an Apple M4 Pro.  
The slowdown is due to Python’s dynamic dispatch, ~28 bytes per int overhead,
and GIL reference‑counting; the GIL itself does not hurt single‑threaded code.

Recent CPython releases offer modest gains: 3.10→3.11 gives ≈1.4× speedup
via adaptive specialization; 3.13 adds a lightweight JIT but shows no benefit yet;
free‑threaded mode (3.14t) actually slows single‑threaded programs.

To close the gap, several options exist:

* Runtime alternatives  
  * PyPy / GraalPy: 6–66× faster with zero code changes; startup slower due to JVM/JIT warm‑up and limited ecosystem support.  
  * Codon, Mojo nightly, Taichi: 26–198× gains but require full rewrites or older CPython versions.

* Compiled extensions  
  * mypy‑c (typed Python → C): 2.4–14× speedups; needs type annotations and only optimises a subset of features.  
  * Rust/PyO3: 113–154×, especially when the entire data pipeline is handled natively (e.g., JSON parsing).  
  * Cython: 99–124× when developers adopt C semantics, write type annotations, and avoid pitfalls like ** operator, missing cdivision, or pre‑computed indices.

* Accelerated libraries  
  * NumPy: up to 520× on vectorisable matrix‑vector workloads via BLAS; ineffective for sequential or small arrays.  
  * JAX JIT: up to 1 633× on array programs rewritten with lax.fori_loop and lax.cond (requires functional‑style code).  
  * Numba @njit: 56–135× when compiled over NumPy arrays; struggles with general Python objects or strings.

In realistic workloads (≈100 k JSON events), the best achievable speedup is ~6.3× by using a native Rust or Cython parser that avoids creating Python dictionaries via json.loads(). Choosing the right tool can dramatically reduce runtimes in data‑intensive, scientific, and performance‑critical applications.

本文

主要ポイント

Python が 遅い のは、設計上で高速化よりも動的挙動を優先しているからです。
下の「階段」では、各最適化手順に必要な労力と実際に期待できる速度向上を示しています。

ツール/テクニック労力典型的な速度向上備考
0CPython のアップグレード (3.10 → 3.11/3.13)なし – 新しいイメージを使うだけn‑body で約1.4×、spectral‑norm で約1.05×より高速な CPython は適応型バイトコード特殊化を追加
1別のランタイム (PyPy, GraalPy)インタプリタを切り替える6–66×PyPy:トレーシング JIT、GraalPy:Truffle/JVM JIT
2Mypyc型注釈を追加2.4–14×タイプ付き Python を C 拡張にコンパイル
3NumPyコードをベクトル化520× (spectral‑norm)重い計算を BLAS に委譲、配列中心のアルゴリズムが必要
3aJAX JITループを
lax.fori_loop
+ 関数型スタイルへ書き換え
12–1 633×XLA のグラフ全体コンパイル、線形代数に最適
4Numba (
@njit
)
数値ループをデコレートし NumPy 配列を使用56–135×細かい数値ループで効果的
5CythonPython コードに C 型をアノテーション99–124×C の知識が必要、隠れた「地雷」に注意
6新世代コンパイラ (Codon, Mojo, Taichi)新しい言語/ランタイムを採用26–198×開発体験は粗く、エコシステムは限定的
7Rust via PyO3重要な部分を Rust で書き直す113–154×データフロー全体を所有できると最適

ベンチマーク(Apple M4 Pro)

n‑body (500 k イテレーション)

アプローチ時間速度向上
CPython 3.101 663 ms
CPython 3.141 242 ms1.0×
Mypyc518 ms2.4×
PyPy98 ms13×
GraalPy211 ms5.9×
Codon47 ms26×
Taichi16 ms78×
Mojo16 ms78×
Numba @njit22 ms56×
Cython10 ms124×
Rust (PyO3)11 ms113×

Spectral‑norm (N=2000)

アプローチ時間速度向上
CPython 3.1414 046 ms
Mypyc990 ms14×
PyPy1 065 ms13×
GraalPy212 ms66×
Codon99 ms142×
Taichi71 ms198×
Mojo118 ms119×
Numba @njit104 ms135×
NumPy27 ms520×
JAX JIT8.6 ms1 633×
Cython142 ms99×
Rust (PyO3)91 ms154×

JSON イベントパイプライン (100 k イベント)

アプローチ時間速度向上
CPython 3.14 (
json.loads
+ Python コード)
105 ms
Mypyc77 ms1.4×
Cython67 ms1.6×
Rust (serde, raw bytes)21 ms
Cython (
yyjson
, raw bytes)
17 ms6.3×

重要な洞察 – 本質的なボトルネックは

json.loads()
でした。
データをネイティブコード(Cython または Rust)でパースすると、純粋 Python に比べ約5–6倍の高速化が実現しました。


上げるべきか止めるべきか

ツール労力典型的な利得いつ有効か
CPython のアップグレードなし1.4×すべてのプロジェクトで最初に行うべき
Mypyc型ヒントを追加2–14×タイプ付きコードベースがある場合
PyPy / GraalPyインタプリタ切替6–66×純 Python、C 拡張なしのプロジェクト
NumPy数学をベクトル化520×線形代数や要素ごとの演算に最適
JAX関数型リライト最大1 633×XLA に収まる大規模配列ワークロード
Numbaループデコレート + NumPy 配列56–135×細かい数値ループに適用
CythonC アノテーションとデバッグ99–124×C スタイルコードを書ける場合
Rust (PyO3)Rust を学び重要部分を再実装113–154×データフロー全体を所有したい場合

多くの Python ワークロードは I/O バウンドであったり、ハイレベルライブラリに依存しています。
そのようなケースでは階段はほとんど効果がありません。
実際のホットスポットを特定するために

cProfile
line_profiler
を使ってプロファイルを取ることが不可欠です。


補足メモ

  • GIL:単一スレッドベンチマークでは影響なし。除去すると参照カウントのオーバーヘッドで逆に遅くなる場合があります。
  • CPython 3.13 JIT:今回のベンチマークでは改善が見られませんでした。後続リリース(≈ 8 % の向上)で効果が出るようです。
  • Nuitka, Pythran, SPy, CinderX:本稿では触れていませんが、将来のプロジェクトで注目すべき技術です。

TL;DR

  1. 最新 CPython にアップグレード – 無料で 1.4× の向上。
  2. 型注釈済みなら Mypyc を実行 – 数分の作業で 10×以上の加速。
  3. 純粋な数値ループには Numba または Cython を試す。
  4. 大規模配列ワークロードなら NumPy(または JAX が関数型リライト可能なら)を選ぶ。
  5. データ解析や所有権がボトルネックなら Rust か Cython のネイティブパーサーに切り替える。

ハッキング、楽しんでください!

同じ日のほかのニュース

一覧に戻る →

2026/03/15 7:10

**アゲルス・リナックス ― 時代を超えて使えるソフトウェア** このソフトウェアは、年齢や経験に関係なく「時代を越えた使いやすさ」と柔軟性を重視するユーザー向けに設計されています。

## Japanese Translation: --- ## Summary Ageless Linux は意図的にカリフォルニア州の AB 1043 年齢確認法を拒否し、監視への抗議として Debian ベースのディストリビューションを位置付けつつ、オペレーティングシステムプロバイダーであり続けます。プロジェクトは標準の `/etc/os-release` ファイルを Bash スクリプト経由で「Ageless Linux」に置き換え、通常モードでも **“flagrant” モード** でも年齢確認 API を提供しません。「flagrant」 モードでは `/etc/ageless/REFUSAL` ファイルをインストールし、§ 1798.501(a)(1)–(a)(2) に対する完全かつ意図的な非準拠を明示的に宣言し、執行措置を促します。 ウェブサイトには子供、学校、図書館、および USB ドライブや Raspberry Pi Pico デバイスを通じて OS を配布するための **詳細なガイダンス** が含まれており、これらはすべて AB 1043 の下でオペレーティングシステムプロバイダー活動に該当します。また、ディストリビューションが年齢データを収集しないため「影響を受ける子供」を特定できず、影響を受ける子供ごとの罰金を算出できないことも説明しています。 Ageless Linux は暗号的に不可能であることとプライバシー懸念を理由に年齢確認を決して実装しないと主張し、Apple、Google、Microsoft などの大手テック企業が最小限のコストで AB 1043 を満たすケースとは対照的です。プロジェクトの FAQ は法的問題、コンプライアンス状況、および州最高検事への罰金可能性に関する一般的な質問に対応しています。 最後に Ageless Linux は裁判記録を取得するために、Raspberry Pi または USB ドライブを子供へ配布したことによる **$7,500 の罰金** をカリフォルニア州最高検事に請求し、AB 1043 が小規模オープンソースプロジェクトにどのように適用されるかを明確にすることを目的としています。サイトには法的問い合わせや報道関係者向けの連絡先情報(John McCardle、BDFL、FFwF Robotics LLC)が掲載されています。 ---

2026/03/15 6:27

**Show HN:Han – Rustで書かれた韓国語プログラミング言語**

## Japanese Translation: ## 要約 ハンは静的型付けでコンパイルされるプログラミング言語で、キーワードはすべて韓国語で記述されています(例:**함수**、**만약**、**반복**、**변수**)。コンパイラはRustで実装され、LLVM IRを生成し、clangがそれをネイティブバイナリに変換します。ツリー走査型インタープリタ(`hgl interpret`)により、すぐに実行して迅速な試験が可能です。 ハンの型システムは静的で、5つのプリミティブ型を持ちます—정수 (int)、실수 (float)、문자열 (string)、불 (bool)、그리고 없음 (void)。また配列・構造体・クロージャ・パターンマッチング・エラーハンドリング・ファイルI/O・フォーマット文字列・モジュール・ジェネリクス、組み込み数学関数もサポートしています。現在、配列と構造体はインタープリタのみで扱われており、コンパイラの完全なサポートは計画中です。 開発者はハンを REPL(`hgl repl`)、LSP サーバー(`hgl lsp`)によるエディター上のホバー/補完、およびさまざまな CLI コマンド:`interpret`、`build`、`run`、`repl` で操作できます。VS Code 統合は `editors/vscode` ディレクトリにあります。インストールには Rust(≥1.70)と clang が必要で、他の外部コンパイラ依存はありません。 現在の制限としては、タプル・列挙型・非同期/並行処理・ネットワーキング・サブプロセス、および配列/構造体の完全なコンパイルサポートが欠如しています。これらのギャップは今後の開発優先事項を示しています。

2026/03/15 8:10

エアバスは無人戦闘機を二機開発中です。

## Japanese Translation: Airbus は、2029 年までにドイツ空軍へ運用可能な無人協調戦闘機(UCCA)を納入する予定であり、これは Kratos Defense & Security Solutions の Valkyrie プラットフォーム上に構築され、Airbus の Multiplatform Autonomous Reconfigurable and Secure (MARS) ミッションシステムと AI‑有効化された MindShare ソフトウェアを備えています。 MARS システムは、人有人機と無人機の全グループを動的および非動的ミッションで統合して調整することができます。 **主要技術仕様:** - 元の UCCA は長さ 9.1 m、翼幅 8.2 m、航続距離 >5,000 km、MTOW 約 3 t、最大高度 45,000 ft。初飛行は 2019 年に実施されました。 - ドイツ版の初飛行は 2026 年に予定されています。 このパートナーシップには、Airbus と Rafael が Eurofighter コマンド機上で Litening 5 Advanced Targeting Pod をアップグレードし、クロスプラットフォーム接続性と戦闘致死率を向上させる作業も含まれます。 Airbus のエグゼクティブ・マーコ・ガンブラッハトは、「信頼できる主権的な戦闘能力を手頃な価格で提供する」ことの重要性を強調し、Kratos のスティーブ・フェンドリーは「ミッション化された Valkyrie は単独でも、チームとしても、人有人機と無人機の協同作戦においても利用可能である」と述べています。 この取引はドイツにタイムリーかつ大量展開が可能なドローンソリューションを提供し、AI 主導型多プラットフォーム戦闘システムへのより広範な転換を示しています。

Python:最適化の階段 (タイトルのみ) | そっか~ニュース