2013-06-14 6 views
6

良い日、私はいくつかの数値演算のためのPythonモジュールを書いています。多くのことが進行中であるため、私は計算時間を改善するためにコードを最適化するために最後の数日を費やしてきました。 しかし、Numbaに関する質問があります。 は基本的に、私は次のように初期化するnumpyの配列、あるいくつかのフィールドを持つクラスを持っている:ベクトル化された関数のPythonとNumba

だから、
def init(self): 
    a = numpy.arange(0, self.max_i, 1) 
    self.vibr_energy = self.calculate_vibr_energy(a) 

def calculate_vibr_energy(i): 
    return numpy.exp(-self.harmonic * i - self.anharmonic * (i ** 2)) 

、コードがベクトル化、およびいくつかの改善がNumbaのJITの結果を使用しています。しかし、クラスの外側からcalculate_vibr_energy関数にアクセスし、iの代わりに配列の代わりに単一の整数を渡す必要があることがあります。 私が理解する限り、calculate_vibr_energyでNumbaのJITを使用すると、常に引数として配列をとる必要があります。だから、

、次のオプションの方が良い: 1)のみ、単一の整数値を取り、あまりにもそれに 2をNumbaを使用する新しい関数calculate_vibr_energy_single(i)を、作成)機能のすべての使用を置き換えこれと類似している:

これで
myclass.calculate_vibr_energy(1) 

tmp = np.array([1]) 
myclass.calculate_vibr_energy(tmp)[0] 

以上の効率的な(あるいは少なくとも、より多くのPython-IC)、その他があることを行う方法?

+2

彼はnumbaを意味しました。 numbaはnumpy用のJITコンパイラです。https://github.com/numba/numba –

+0

3番目のオプションは、整数ではなく長さ1の配列を渡すことです。 – Bitwise

答えて

1

私は間違っているかもしれないので、numbaで少ししか遊んでいませんが、私が理解している限り、 "autojit"デコレータを使用すると、どのタイプの引数も取ることができる関数を与えるべきです。

http://numba.pydata.org/numba-doc/dev/pythonstuff.html

+0

ありがとう!これは最も簡単な方法です(読みやすさに優しい)方法です。 –

関連する問題