【要約】長い式を食べさせて Python を殺す [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
著者は、Pythonのバージョンや実装の違いが、極端な構文に対してどのような挙動を示すかを調査した。バージョンアップに伴う内部的な制限値の変更が、実行時の安定性にどう影響するかを明らかにすることが目的である。具体的には以下の課題を検証している。
- ・バージョンによりエラーの種類(RecursionError, MemoryError等)が異なる。
- ・特定のバージョンで限界値が劇的に減少する現象(例:CPython 3.10の二項演算)。
- ・GILの有無(free-threaded)が挙動に与える影響の不明瞭さ。
// Approach
著者は、Rubyを用いて各Python環境に極端に長い式を段階的に投入する自動テスト環境を構築した。二分探索を用いて、エラーが発生する境界値を効率的に特定する手法を採用している。
- ・
uvを使用して、CPython(GILあり/なし)およびPyPyの各環境を隔離・実行。 - ・二項演算、括弧、if-else、リスト、メソッド、単項プラス、タプルの7パターンで実験。
- ・式を漸進的に長くし、エラーが発生した瞬間の値を記録。
// Result
実験の結果、Pythonのバージョンアップに伴うスタック管理や制限値の変遷が明らかになった。バージョンによって、制限が緩和されるケースと、クラッシュ回避のために天井が設けられるケースの両方が確認された。
- ・CPython 3.10以降、二項演算の限界値が大幅に減少した。
- ・CPython 3.14以降、Stack overflowが発生するケースを確認した。
- ・PyPyは一貫してRecursionErrorを出す傾向がある。
- ・メソッドチェインにおいて、GILの有無で挙動が異なるケースが存在する。
Senior Engineer Insight
> 実用上の影響は限定的だが、LLMによるコード生成が極端な構造を出力するリスクを考慮すべきだ。機械生成コードが深いネストを持つ場合、ランタイムのスタック消費が予期せぬクラッシュを招く可能性がある。特に、バージョンアップで制限値が大きく変動する点は、CI環境の安定性や実行環境の選定において無視できないリスクとなる。エッジケースの挙動を把握しておくことは、堅牢なシステム設計の観点から重要である。