2017-01-20 5 views
5

Я использую стабильную версию Numba 0.30.1.Как использовать numba для функции-члена класса?

Я могу это сделать:

import numba as nb 
@nb.jit("void(f8[:])",nopython=True)        
def complicated(x):         
    for a in x: 
     b = a**2.+a**3. 

в качестве тестового примера, и убыстрение огромна. Но я не знаю, как действовать, если мне нужно ускорить функцию внутри класса.

import numba as nb 
def myClass(object): 
    def __init__(self): 
     self.k = 1 
    #@nb.jit(???,nopython=True)        
    def complicated(self,x):         
     for a in x: 
      b = a**2.+a**3.+self.k 

Какой тип numba я использую для объекта self? Мне нужно иметь эту функцию внутри класса, так как ей нужно получить доступ к переменной-члену.

+0

Как насчет [ 'jitclass'] (http://numba.pydata.org/numba-doc/dev/user /jitclass.html)? Я не думаю, что в противном случае можно избежать «обхода объекта», учитывая, что 'self' по определению является _объектом_. – MSeifert

+0

И что будет делать 'b = a ** 2. + a ** 3. + self.k', если вы сразу же перепишете его в следующем цикле? – MSeifert

+0

'self.k' просто для того, чтобы схематически показать, что мне нужно будет вызывать переменные-члены и не может просто иметь функцию вне класса – dbrane

ответ

3

У вас есть несколько вариантов:

Используйте jitclass (http://numba.pydata.org/numba-doc/0.30.1/user/jitclass.html) к "Numba-Изе" все это.

Или сделать функцию-член обертку и передать переменные-члены через:

import numba as nb 

@nb.jit 
def _complicated(x, k): 
    for a in x: 
     b = a**2.+a**3.+k 

def myClass(object): 
    def __init__(self): 
     self.k = 1 

    def complicated(self,x):         
     _complicated(x, self.k) 
+1

. Я видел эту страницу на' jitclass', но совершенно неясно, как я могут явно указывать типы данных для каждой функции-члена. Не могли бы вы показать пример? Подход функции «обертка» становится неэлегантным и превосходит меня, когда я начинаю с вещей, которые нужно положить в класс. – dbrane

+0

Я бы не стал объявлять типы аргументов функции-члена и просто Numba обрабатывал ее с помощью вывода типа. В недавней памяти я не могу вспомнить, как объявлять типы, чтобы повысить производительность. Существуют более сложные примеры jitclass в https://github.com/numba/numba/tree/master/examples - например. https://github.com/numba/numba/blob/master/examples/stack.py – JoshAdel

+0

@dbrane, поскольку я знаю, что методы класса не могут быть помещены в текущей версии numba. Если попытаться сделать это, появится довольно ясное сообщение об ошибке «TypeError: члены класса еще не поддерживаются: сложны». Кроме того, я обнаружил, что использование jitclass не дает ускорения для вашего примера. –