世界を動かす技術を、日本語で。

Pythonのパフォーマンスに関する神話とおとぎ話

2025年8月6日原文(lwn.net)

概要

  • EuroPython 2025で Antonio Cuni が「Pythonパフォーマンスの神話とおとぎ話」について講演
  • Pythonのパフォーマンスに関する 誤解や神話 を実例で解説
  • メモリ管理 がPython高速化の最終的な壁であると指摘
  • 静的型付けやJIT導入でも 本質的な問題 は解決しない現状
  • 新プロジェクト SPy による超高速Python実現への期待

EuroPython 2025講演:「Pythonパフォーマンスの神話とおとぎ話」

  • 講演者は PyPy開発者 であり、長年Pythonのパフォーマンスに取り組む Antonio Cuni

  • 会場で「Pythonは遅いと思うか」と質問、多くの手が挙がる

  • 「Pythonは遅くない」「Pythonはグルー言語だから速度は問題ない」といった 神話の否定

  • Pythonで十分速いプログラムもあるが、 全ての用途に適しているわけではない

  • パフォーマンスが求められる場面では CythonやNumba などの利用が進む現状

    • Pythonが速いとされる用途と、全てのPythonプログラムの関係を ベン図 で説明
  • 「グルー言語だからホットスポットだけC/C++やRustで書けば良い」という 考えの限界

    • パレートの法則 (80/20則)や アムダールの法則 により、最適化には限界がある

Pythonが遅い本当の理由

  • 「インタプリタだから遅い」は 部分的な真実 に過ぎない
  • 例:p.x * 2 という表現でも、Pythonでは 多段階の処理とメモリアロケーション が発生
  • これらは 言語の動的性質 に起因し、インタプリタか否かは本質的な問題ではない

静的型付けと最適化の誤解

  • Pythonの型アノテーションは 実行時に強制されない
  • 型ヒントがあっても、 実際には様々な型の値が渡される可能性 がある
  • クラス定義や特殊メソッドの削除、インポートの動的変更など、 静的解析・コンパイルの困難性 を例示

JIT導入の限界と「最適化チェイシング」

  • JIT導入で 高速化は可能だが、実装は複雑化
  • JITの挙動を意識した コード設計が必要 となり、パフォーマンス予測が難しい
  • 一部の最適化が崩れると 全体が急激に遅くなる現象 (最適化チェイシング)の発生

Pythonの極端な動的性質

  • import文の挙動やグローバル変数の値、型アノテーション、デコレータなど、 何が起きるかコンパイラは予測困難
  • 99%のケースでは素直な使い方だが、 1%のダイナミズムがPythonの魅力 でもある
  • ライブラリ開発者が ダイナミックな機能 を活用して使いやすいAPIを実現

コンパイラゲーム:何も信じられないPythonコード

  • 動的属性追加、ランダムなメソッド定義、__new__のトリック、グローバルの差し替えなど 極端な例 を紹介
    • これらが 最適化や静的解析の壁 となる

抽象化とパフォーマンスのトレードオフ

  • コードの見通しや保守性を求めて 関数化やデータクラス化 すると、 オーバーヘッドが発生
  • JITでも 関数呼び出しや抽象化のコスト を完全には消せない
  • Pythonでは「 抽象化は無料ではない」という現実

Python高速化の限界と今後

  • パフォーマンスを突き詰めると 最終的にメモリ管理の壁 に直面
  • 現状のCPythonやPyPyの枠組みでは 根本的な高速化は困難
  • SPyプロジェクト :より速いPython実現を目指す初期段階の取り組み
  • 理想は「 全ての用途にPythonが使える世界」だが、現状はまだ道半ば

この講演は、 Pythonパフォーマンスに関する誤解や現実、そして 今後の可能性 を多面的に解説する内容。 最適化手法の限界や、 言語仕様がもたらす根本的な難しさ について深く掘り下げている。

Hackerたちの意見

いい記事だね。あの問題の多くはPython特有じゃないから、30年も前の言語から他の人が学べることの良い概要だと思う!多分、JS/TSの道を進むことになるだろうね。別のコンパイラ(PyPyとかmypyとか他の何か)がCPythonと一緒に動く感じ。でも、Python4は来ないと思うな。

GILがなくなるなんて思ってもみなかったけど、今ここにいるよね。何事も可能性はゼロじゃない。もしかしたらPython4は別のコンパイラを使ったPythonかもね。

JS/TSの話がよくわからないんだけど、TSは単なる型チェッカーで、ランタイムパフォーマンスには全く影響しないよね。

99%のパフォーマンスを1%のケースのために払ってるってことだよね。なんでみんなこれが良いトレードオフだと思うんだろう?

コードを書くのが楽しいからだよ。全てがスケールする必要も速くある必要もないし。個人的には、99%の時間を最適化して1%のために使うのがもっとクレイジーだと思う。

確実に言えるのは、一銭も払ったことがないってこと。君は?

コンピュータは、プログラミングを始めた頃の100倍以上速くなってるし、その頃ですでに十分速かったんだよね。(その間に自分のコーディング能力はあまり良くなってないし、むしろ悪くなってるかも)

1%なんて全然足りないよ。pytestやPydanticみたいなよく使われるライブラリが成り立つのはそのおかげなんだから。

多くの人がSmalltalkやCommon Lisp、Self、Dylanを使ったことがないから、CPythonが唯一の選択肢だと思ってるんだよね。それに、Electronアプリでリソースを無駄にしてるから、CPythonのパフォーマンスについて疑問を持つこともほとんどない。

そうじゃないよ。Pythonには向いてないことがたくさんある。ただ、ずっと前から存在してるし、サイバーセキュリティみたいな影響力のあるニッチな分野では、Pythonはネイティブツールよりも役立つこともあるし、複数のプラットフォームで動くからね。

大抵の場合、待ってるのは人間か、少なくともCPU以外の何かだよね。プログラマーがコードを書くのにかかる時間の方が、全ユーザーがプログラムが動くのを待つ時間よりも長いことが多い。だから、これら二つの間では、パフォーマンスは大抵トレードオフしても問題ないよ。

コードが正しくないなら、パフォーマンスは無意味だよ。簡単なケースでは、Pythonで正しいコードを書くのが比較的早いし(整数はCのようにオーバーフローしないし、C#のようにラップアラウンドもしないし、他のスクリプト言語のような馬鹿げた暗黙の変換もない)。また、ほとんどの場合、コードが速くある必要はない。たまに人間が実行する数値計算が必要なだけなら、1秒かかっても大丈夫だよ。シェルスクリプトの代わりにもかなり良い。

Hacker Newsで議論の続きを見る