貴様はまだPythonを知らない。リファレンス実装CPythonをビルドし、世界の理を書き換えろ
よかろう。貴様のような向学心を持つエンジニアに、この世界の「根源」たる CPython の圧倒的な力と、その支配方法を授けてやろうではないか!
多くの者は Python を単なる「書きやすい言語」だと思っている。だが、その背後で糸を引く黒幕こそが CPython だ。
Python は仕様(言語のルール)に過ぎない。その仕様を現実に具現化し、CPUに命令を下す「実体」こそが、C言語で書かれたこのリファレンス実装なのだ。
「魔法」の正体を知る
dict や list がなぜ速いのか、メモリがどう管理されているのか、そのアルゴリズムの極致を C 言語のソースコードレベルで拝謁できる。
パフォーマンスの限界突破
Python の皮を脱ぎ捨て、C 言語で拡張モジュールを書けば、計算速度を数十倍、数百倍へと加速させることが可能だ。
バグの真理に到達する
ライブラリの挙動が怪しい時、CPython のソースまで潜れば、そこには嘘偽りのない「真実」が記述されている。
既製品の Python を使うなど、真の支配者のすることではない。自らの手でソースからビルドし、自分だけの Python を錬成するのだ。
まずは GitHub という名の聖域から、ソースコードをクローンせよ。
git clone https://github.com/python/cpython.git
cd cpython
ビルドに必要な供物(ライブラリ)を揃えるのだ。Ubuntu ならばこうだ。
sudo apt-get update
sudo apt-get install build-essential gdb lcov pkg-config \
libbz2-dev libffi-dev libgdbm-dev liblzma-dev \
libncurses5-dev libreadline6-dev libsqlite3-dev \
libssl-dev lzma lzma-dev tk-dev uuid-dev zlib1g-dev
さあ、構成を決定し、並列ビルドで一気に形を成せ!
./configure --with-pydebug
make -j$(nproc)
これで、カレントディレクトリに python という名の、デバッグ情報の詰まった強力な実行ファイルが降臨する。
Python の限界を超えたいか? ならば、C 言語で直接 Python の関数を記述するがいい。これが、数多の高速ライブラリ(NumPy など)が用いている手法だ。
#include <Python.h>
// 闇の魔術:引数を2つ受け取り、その和を返す
static PyObject* spam_add(PyObject* self, PyObject* args) {
long a, b;
if (!PyArg_ParseTuple(args, "ll", &a, &b))
return NULL;
return PyLong_FromLong(a + b);
}
// メソッドの定義
static PyMethodDef SpamMethods[] = {
{"add", spam_add, METH_VARARGS, "Add two numbers in C."},
{NULL, NULL, 0, NULL}
};
// モジュールの定義
static struct PyModuleDef spammodule = {
PyModuleDef_HEAD_INIT, "spam", NULL, -1, SpamMethods
};
// 初期化関数
PyMODINIT_FUNC PyInit_spam(void) {
return PyModule_Create(&spammodule);
}
これをビルドして Python から呼び出せば、もはや貴様に敵はいない。
CPython のリポジトリを弄ぶということは、単なるプログラミングを超え、コンピュータサイエンスの深淵を歩むということだ。 ガベージコレクションの仕組み、Global Interpreter Lock (GIL) の呪縛、そして AST(抽象構文木)の変遷……。
これらを理解した時、貴様は「Python を書く者」から「Python を操る者」へと進化するだろう。
クックック……。どうだ? 早速 Objects/dictobject.c あたりから読み解き、ハッシュテーブルの真理に触れてみる気はないか?