Prompt

Pythonがちょっとだけ嫌われる理由は、動的型付けであること以外に何か理由はある?

Pythonが、その圧倒的な人気の一方で、君のような「一意性」や「厳格さ」を重んじるエンジニアから「ちょっとだけ(あるいは情熱的に)」嫌われてしまう理由は、動的型付け以外にもいくつか根深いものがあるよ。

特に情報工学を学んでいる立場からすると、Pythonの「優しさ」が、大規模開発やパフォーマンスの文脈では「脆さ」や「怠慢」に見えてしまうんだよね。その理由を解剖してみよう!


1. 実行速度の限界と「GIL(グローバルインタプリタロック)」

これが、並行処理を愛するエンジニアがPythonを避ける最大の理由の一つだ。

  • GILの呪い: Python(CPython)には、一度に一つのスレッドしかバイトコードを実行できないようにするロック(GIL)がある。

  • 絶望: せっかくマルチコアのCPUを持っていても、CPUバウンドな処理ではマルチスレッドによる並列化の恩恵が受けにくいんだ。

  • 君への刺さりポイント: RustやGoのように「マルチコアを使い切る」という快感が、Pythonでは標準機能だけだとなかなか味わえない。


2. インデントによる強制的な構造(オフサイドルール)

「読みやすさ」のための仕様だけど、これが「表現の自由」を奪うと感じる人も多い。

  • コピペの恐怖: コードをコピペしたときに、インデントが一つズレるだけで論理構造が変わってしまう。

  • ラムダ式の制限: Pythonの lambda は 1 行しか書けない。これはインデントでブロックを表現する仕様上、複数行の無名関数を埋め込むのが構造的に難しいからなんだ。

  • 結論: 「一意に読みやすい」反面、「トリッキーだけど美しい書き方」が許されない窮屈さがある。


3. 「暗黙的」な挙動と名前空間の汚染

Pythonは「明示的であることは、暗黙的であるより良い(The Zen of Python)」と掲げているけれど、実際には結構「暗黙的」な部分がある。

  • 変数のスコープ: 関数内で変数に代入すると、宣言なしでローカル変数になる。これがタイポ一つで「新しい変数の作成」になってしまい、バグの温床になる。

  • import * のカオス: from module import * を許容しているため、どこから来たか分からない名前が名前空間に溢れることがある。これは君が大切にしている「定義の追跡可能性」を破壊する行為だね。


4. パッケージ管理と「環境の地獄」

Pythonの環境構築は、歴史が長い分、非常に複雑で混乱しやすい。

  • ツールの乱立: pip, venv, conda, poetry, pdm, uv…。どれを使うのが「一意な正解」なのか、初心者には(そしてプロにも)分かりにくい。

  • 依存関係の衝突: システム全体のPythonを汚してしまい、あるアプリを動かそうとすると別のアプリが壊れる、という「依存関係の地獄」に陥りやすい。


5. 「遅い」というイメージの定着

インタプリタ言語である以上、C言語やRustに比べれば実行速度は数十倍から数百倍遅い。

  • 「ライブラリは速い」のまやかし: NumPyなどは内部でCを使っているから速いけれど、純粋なPythonコード(ループ処理など)を書いた瞬間にパフォーマンスが崖から落ちる。

  • エンジニアの矜持: 「速いコードを書く工夫」よりも「速いライブラリを呼ぶ工夫」に終始しがちなのが、プログラマとしての成長を阻害すると感じる人もいるんだ。


見落とされがちな視点:後方互換性の歴史的トラウマ

Python 2からPython 3への移行には、実に 10年以上 の歳月がかかった。この「言語仕様を劇的に変えるとコミュニティが引き裂かれる」という経験が、Pythonを保守的にし、進化のスピードを(Rustなどと比較して)慎重にさせている側面もあるよ。


結論

Pythonが嫌われる理由は、「一意に厳格であろうとするエンジニアの意志」を、「言語側の親切心(あるいは妥協)」が先回りしてスポイルしてしまうから かもしれない。

でも、最近は mypy による静的解析や、 uv のような高速なパッケージマネージャ、そしてGILを撤廃しようとする動き(PEP 703)もあり、少しずつ「厳格なエンジニア」にとっても住みやすい場所になろうとしているよ。

次は、「Pythonの型ヒントを最大限に活用して、動的型付けの危うさをどこまでRustに近づけられるか」 という限界に挑戦してみる?

Would you like me to code a sample showing how to use ‘Pydantic’ and ‘Mypy’ to enforce strict type checking in Python, making it feel almost like a compiled language?