2013-06-14 20 views
6

İyi günler, bazı sayısal çalışmalar için bir Python modülü yazıyorum. Çok fazla şey olduğu için, hesaplama zamanlarını iyileştirmek için son birkaç günü kodlamayı optimize ettim. Bununla birlikte, Numba ile ilgili bir sorum var. Temelde, aşağıdaki şekilde başlatmak numpy dizilerdir bazı alanlarda, bir sınıf var:Vektör fonksiyonları için Python ve 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)) 

Yani, kod vectorized ve bazı iyileşme numba en JIT sonuçlarını kullanarak. Ancak bazen calculate_vibr_energy işlevine sınıfın dışından erişmem ve i yerine bir dizi yerine tek bir tam sayı geçirmem gerekiyor. Anladığım kadarıyla, eğer numba'nın JIT değerini calculate_vibr_energy üzerinde kullanırsam, her zaman argüman olarak bir dizi almak zorunda kalacak.

Yani, aşağıdaki seçeneklerden Hangisi daha iyi: 1) çok 2) fonksiyonunun tüm kullanımlarını değiştirin sadece tek tamsayı numarası alacak yeni bir fonksiyon calculate_vibr_energy_single (i) oluşturun ve üzerine Numba kullanmak bunu yapmanın orada diğer, daha verimli (en azından, daha Python ic veya) yolları

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

veya şunlardır: bununla

myclass.calculate_vibr_energy(1) 

: bu seferki benzer olduğunu?

+2

Numba demek istedi. numba, numpy için bir JIT derleyicisi: https://github.com/numba/numba –

+0

Üçüncü bir seçenek, tamsayı yerine 1 uzunluğunun bir dizisini geçirmek olabilir. – Bitwise

cevap

1

Sadece numba ile biraz oynamışım, bu yüzden yanılmış olabilirim, ama anladığım kadarıyla, "autojit" dekoratörünü kullanmak, herhangi bir türden argüman alabilen fonksiyonlar vermelidir.

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

+0

Teşekkürler! Bu yapmak için en basit yol (ve okunabilirlik dostu) yolu gibi görünüyor. –