「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Pandas の列作成では、np.vectorize() が df.apply() よりも速いのはなぜですか?

Pandas の列作成では、np.vectorize() が df.apply() よりも速いのはなぜですか?

2024 年 11 月 8 日に公開
ブラウズ:739

  Why is np.vectorize() Faster than df.apply() for Pandas Column Creation?

Pandas apply と np.vectorize のパフォーマンス比較

np.vectorize() は df よりも大幅に高速であることが観察されています。 apply() は、Pandas DataFrame 内の既存の列に基づいて新しい列を作成するときに使用します。観察されたパフォーマンスの違いは、これら 2 つのメソッドで採用されている基礎的なメカニズムに起因します。

df.apply() と Python レベルのループ

df.apply() は本質的にDataFrame の各行を反復する Python レベルのループ。提供されたベンチマークで実証されているように、リスト内包表記やマップなどの Python レベルのループはすべて、実際のベクトル化された計算に比べて比較的遅いです。

np.vectorize() と df.apply()

np.vectorize() は、ユーザー定義関数をユニバーサル関数 (ufunc) に変換します。 Ufuncs は高度に最適化されており、C ベースのコードと最適化されたアルゴリズムを活用して、NumPy 配列に対して要素ごとの操作を実行できます。これは、Pandas シリーズ オブジェクトを操作し、追加のオーバーヘッドが発生する df.apply() とは対照的です。

真のベクトル化: 最適なパフォーマンス

真に効率的な列作成のために、NumPy 内でベクトル化された計算を強くお勧めします。 numpy.where や df["A"] / df["B"] による要素ごとの直接除算などの操作は非常に高速で、ループに関連するオーバーヘッドを回避します。

Numba Optimisation

効率をさらに高めるために、Python 関数を最適化された C コードに変換するコンパイラーである Numba を使用してループをさらに最適化することができます。 Numba は実行時間をマイクロ秒まで短縮でき、df.apply() と np.vectorize() の両方を大幅に上回ります。

結論

np.vectorize() は、 df.apply() よりもいくらか改良されていますが、NumPy のベクトル化された計算の真の代替品ではありません。最大のパフォーマンスを達成するには、Numba の最適化を利用するか、NumPy 内でベクトル化された操作を直接使用して、Pandas DataFrames で新しい列を作成します。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3