2017-10-18 17 views
1

numba.jit을 파이썬으로 사용.numba.jit을 메서드로 사용하는 방법

나는 JIT 형으로 정상적인 기능을 변환하고 실행할 수 있습니다

from numba import jit 

def sum(a, b): 
    return a+b 

func = jit(sum) 
print(func(1, 2)) 

어떻게 방법으로이 일을? 이런 식으로 (이것은 작동하지 않고 왜 그런지 알고 있습니다).

from numba import jit 

class some_class: 
    def __init__(self, something = 0): 
     self.number = something 
    def get_num(self): 
     return self.number 

my_object = some_class(5) 
func = jit(my_object.get_num) 
print(my_object.func()) 

P. 또한 데코레이터를 사용해 보았지만 작동하지만 가져온 클래스 (자신을 정의하지 않은 클래스)에는 사용할 수 없으므로이를 조사하고 있습니다.

답변

0

(하지만 객체 모드에서) 당신은 방법을 결합 JIT 수는 없지만, 언 바운드 방법을 JIT 수 있습니다

from numba import jit 

class some_class: 
    def __init__(self, something = 0): 
     self.number = something 
    def get_num(self): 
     return self.number 
    func = jit(get_num) 

my_object = some_class(5) 
print(my_object.func()) 
# 5 

주를 예상해서는 안이, nopython 모드를 사용하지 않음 합리적인 속도 향상. 당신은 클래스를 만들 수있는 자체 jitclass (즉, 모든 메소드가 자동으로 nopython-jitted 의미) 그러나 당신이 속성 입력해야합니다 :에

import numba as nb 

spec = [ 
    ('number', nb.int64), 
] 

@nb.jitclass(spec) 
class some_class: 
    def __init__(self, something): 
     self.number = something 
    def get_num(self): 
     return self.number 

my_object = some_class(5) 
print(my_object.get_num()) 

그러나 더 복잡한 클래스가 매우 어려운 (또는 불가능)이 될 것이다 jitclass을 사용하십시오. 내 경험에 의하면 가장 좋은 방법은 단순히 방법 내에서 jitted 함수를 호출하는 것입니다

from numba import njit # like jit but enforces nopython-mode! 

@njit 
def my_func(val): 
    return val # this example is a bit stupid, I hope your real code does more! 

class some_class: 
    def __init__(self, something = 0): 
     self.number = something 
    def get_num(self): 
     return my_func(self.number) 

my_object = some_class(5) 
print(my_object.get_num()) 

그것은 당신의 클래스 및/또는 방법이 사용되어야하는 접근 방식이 얼마나 복잡한에 따라 달라집니다. 귀하의 경우 numba를 전혀 사용하지 않을 것입니다. numba와 jit 오버 헤드를 보완 할 수있는 계산 상으로 값 비싼 물건이 충분하지 않기 때문입니다. 조금 더 복잡하다면 jitclass을 사용하고 훨씬 더 복잡하다면 함수 접근법에서 호출되는 jitted 함수를 사용할 것입니다. 개인적으로 나는 jit을 암시 적으로 객체 모드가 필요하므로 결코 사용하지 않을 것입니다. 그래서 jitted 함수는 unjitted 함수보다 느립니다. 그런데

: 당신은 일반적으로 대신 get_* 또는 set_* 기능 property을 사용하여 파이썬에서 ...