ホームページ  >  記事  >  バックエンド開発  >  Pandas の列作成では、np.vectorize() が df.apply() よりも速いのはなぜですか?

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

Susan Sarandon
Susan Sarandonオリジナル
2024-10-27 04:34:30841ブラウズ

  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 Series オブジェクトを操作し、追加のオーバーヘッドが発生する df.apply() とは対照的です。

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

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

Numba Optimization

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

結論

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

以上がPandas の列作成では、np.vectorize() が df.apply() よりも速いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。