numexprライブラリでnumpy計算速度を最適化する

1131 ワード

注:本稿は私の独立したブログにも同期して発表されています.
NumPyは底層高さ最適化された計算ライブラリによりCに近い効率的な計算を実現できるが,計算が複雑で計算量が膨大な場合には多少遅い.Numexprライブラリは最近発見された非常に簡単で使いやすいNumpyパフォーマンス向上ツールであり、私のニーズからパフォーマンスの問題を大きく解決しました.
まず例を見てみましょう.
import numpy as np
import numexpr as ne
nx, ny = 1200, 1500
a = np.linspace(0.,3.1416,nx*ny).reshape(nx,ny)
for i in range(100):
    b = np.sin(a+i)**2 + np.cos(a+i)**2 + a**1.5

このプログラムは大きなグリッドに対して、複雑な計算を行い、Numpyを使用する場合、私のパソコンは約35.5秒実行する必要があります.
最後の行を変更したらnumexprの式に変更します.
b = ne.evaluate("sin(a+i)**2 + cos(a+i)**2 + a**1.5")

今回の運行時間は3.2秒で、10倍以上のスピードアップ!
numexpr公式サイトの説明によると、現在のCPUの計算速度は多少過剰で、多くのプログラムの計算速度のボトルネックはCPUではなくmemoryで、多くの場合CPUはmemoryがデータを与えるのを待っている.そのためnumexprの主な仕事はデータストレージの面での最適化であり、細部は展開されず、理解しないふりをすることはできない.
さらに興味深いことにnumexprは自動的なマルチスレッド計算を実現でき,複雑な構成を必要としない.それだけでnumbaやcythonなどよりずっと便利です.しかし、上記の対応かもしれませんが、コンピュータのすべての利用可能なコアを使うことはありません.この時、ボトルネックがmemoryにあるからだと推測しています.
個人計算のニーズに応じてnumexprにはいくつかのメリットがあります.
  • プログラムの修正は簡単で、サポートされている関数と式のスピードアップ効果は明らかである.
  • 自動化マルチスレッド;
  • numbaのようなJIT式の最適化に比べて、コンパイルにはほとんど時間がかかりません.