2013-06-14 10 views
6

Dzień dobry, piszę moduł Pythona do niektórych prac numerycznych. Ponieważ dużo się dzieje, spędziłem kilka ostatnich dni na optymalizacji kodu, aby poprawić czas obliczeń. Mam jednak pytanie dotyczące Numby. Zasadniczo, mam klasy z niektórych pól, które są numpy tablice, które zainicjować w następujący sposób:Python i Numba dla wektorów funkcji

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)) 

Więc, kod jest wektorowy i wykorzystywania wyników JIT Numba w pewnej poprawy. Czasami jednak potrzebuję uzyskać dostęp do funkcji calcul_vibr_energy spoza klasy i przekazuję pojedynczą liczbę całkowitą zamiast tablicy zamiast i. O ile rozumiem, jeśli używam JIT Numby na calcul_vibr_energy, zawsze będę musiał przyjąć tablicę jako argument.

Więc, które z poniższych opcji jest lepsza: 1) Utwórz nowy calculate_vibr_energy_single funkcji (I), który zajmie tylko jedną liczbę całkowitą i używać Numba na nim zbyt 2) Wymień wszystkie zwyczaje funkcji które są podobne do tego:

myclass.calculate_vibr_energy(1) 

z tym:

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

lub jakieś inne, bardziej wydajne (a przynajmniej bardziej Python-IC) sposoby robienia tego?

+2

Miał na myśli numbę. numba jest kompilatorem JIT dla numpy: https://github.com/numba/numba –

+0

Trzecią opcją może być przekazanie tablicy o długości 1 zamiast liczby całkowitej. – Bitwise

Odpowiedz

1

Grałem tylko trochę z numba, więc mogę się mylić, ale o ile zrozumiałem, użycie dekoratora "autojit" powinno dawać funkcje, które mogą przyjmować argumenty dowolnego typu.

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

+0

Dzięki! Wydaje się, że jest to najprostszy sposób (i przyjazny dla czytelników) sposób na zrobienie tego. –

Powiązane problemy