24章ハイパフォーマンスpandas:evalとquery
これまで説明したように、PyDataスタックが強力であるのは、NumPyやpandasなどの直感的な上位レベルの構文を、コンパイルされた下位レベルのコードで実行する能力を基盤にしているからです。NumPyのベクトル化やブロードキャスト操作およびpandasのグループ化などがそのよい例です。こうした抽象化は多くの一般的ユースケースで効率的かつ効果的ですが、しばしば一時的な中間オブジェクトを生成し、計算時間とメモリ使用に過大なオーバーヘッドをもたらす可能性があります。
この問題に対応するため、コストのかかる中間配列の割り当てを行わず、C言語コードの実行速度で直接操作を行う機能として、NumExprライブラリ(https://github.com/pydata/numexpr)のeval
関数とquery
関数をpandasは提供します。この章では、この使い方を説明し、どのような場合にこれらを使用するべきか、いくつかの経験則を示します。
24.1 queryとevalの必要性:複合表現
すでに見てきたように、NumPyとpandasは高速なベクトル化演算をサポートしています。例えば、2つの配列の要素ごと加算は次のように実行します。
In [1]: import numpy as np rng = np.random.default_rng(42) x = rng.random(1000000) y = rng.random(1000000) %timeit x + y Out[1]: 2.21 ms ± 142 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Get Pythonデータサイエンスハンドブック 第2版 ―Jupyter、NumPy、pandas、Matplotlib、scikit-learnを使ったデータ分析、機械学習 now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.