【要約】cProfile で特定した1関数を pybind11 で C++ 化したら、どこまで速くなったか [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
RAGのパイプラインを実装する開発者が、Pythonによる文字列操作の遅延に直面した。ベクトル検索後のルールベースによる再ランキング処理において、以下の課題が発生している。
- ・大量のチャンクに対するJaccard類似度計算の実行コスト。
- ・
char_ngram_jaccard関数およびその内部関数が累積実行時間の大部分を占める問題。 - ・どの範囲をC++化すべきかという判断基準の欠如。
// Approach
開発者は、計測に基づいた「最小限のC++化」というアプローチを採用した。闇雲に全体を書き換えるのではなく、以下のステップで最適化を行った。
- ・cProfileを用いて、実行時間の大部分を占めるホットパスを特定。
- ・Python上の単一関数だけでなく、境界を跨ぐ回数を減らすため関連するヘルパー関数もまとめてC++へ移行。
- ・pybind11とscikit-build-core、CMakeを組み合わせ、Pythonから透過的に利用可能な拡張モジュールを構築。
// Result
開発者は、10,000チャンクの再ランキング処理において、実行時間の中央値を約2.9倍改善した。
- ・純Python版:0.1812s (median)
- ・pybind11/C++版:0.0631s (median)
Senior Engineer Insight
> 実務において、闇雲な言語移行はコストに見合わない。本記事のように、計測に基づき「ホットパスのみを逃がす」手法は極めて合理的だ。ただし、PythonとC++の境界における文字列コピーのオーバーヘッドは無視できない。大規模なデータ転送を伴う場合は、この境界コストが改善幅を制限する。2.9倍という数字は、アルゴリズムの計算量が変わらない以上、現実的な限界値に近いと言える。