2017-01-20 18 views
5

Tôi đang sử dụng phiên bản ổn định của Numba 0.30.1.Làm cách nào để sử dụng numba trên một hàm thành viên của một lớp?

tôi có thể làm điều này:

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

như một trường hợp thử nghiệm, và tăng tốc là rất lớn. Nhưng tôi không biết làm thế nào để tiến hành nếu tôi cần tăng tốc một hàm bên trong một lớp.

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 

Tôi nên sử dụng loại numba nào cho đối tượng self? Tôi cần phải có hàm này bên trong một lớp vì nó cần truy cập vào biến thành viên.

+0

gì về một [ 'jitclass'] (http://numba.pydata.org/numba-doc/dev/user /jitclass.html)? Tôi không nghĩ nó có thể tránh được "sự phản đối đối tượng" cho rằng 'self' được định nghĩa là _object_. – MSeifert

+0

Ngoài ra, 'b = a ** 2. + a ** 3. + self.k' sẽ đạt được điều gì khi bạn lập tức ghi đè lên nó trong vòng lặp tiếp theo? – MSeifert

+0

'self.k' chỉ để hiển thị sơ đồ rằng tôi sẽ cần gọi các biến thành viên, và không thể chỉ có hàm bên ngoài lớp – dbrane

Trả lời

3

Bạn có một vài lựa chọn:

Sử dụng một jitclass (http://numba.pydata.org/numba-doc/0.30.1/user/jitclass.html) để "numba-ize" toàn bộ điều.

Hoặc thực hiện chức năng thành viên một wrapper và vượt qua các biến thành viên thông qua:

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

Tôi đã thấy trang đó trên' jitclass' nhưng hoàn toàn không rõ làm sao tôi có thể nêu rõ các kiểu dữ liệu của từng hàm thành viên. Bạn có thể cho thấy một ví dụ? Cách tiếp cận hàm bao bọc trở nên không phù hợp và đánh bại quan điểm của tôi khi đưa mọi thứ vào một lớp để bắt đầu. – dbrane

+0

Tôi sẽ tránh khai báo các kiểu đối số cho hàm thành viên và chỉ cần Numba xử lý nó thông qua kiểu suy luận. Trong bộ nhớ gần đây, tôi không thể nhớ lại việc khai báo các loại để có kết quả tốt hơn. Có một số ví dụ jitclass phức tạp hơn trong https://github.com/numba/numba/tree/master/examples - ví dụ: https://github.com/numba/numba/blob/master/examples/stack.py – JoshAdel

+0

@dbrane như tôi biết các phương pháp của lớp không thể được ghi trong phiên bản hiện tại của tê giác. Nếu cố gắng làm điều đó, thông báo lỗi khá rõ ràng sẽ xuất hiện "TypeError: các thành viên của lớp chưa được hỗ trợ: phức tạp". Ngoài ra, tôi đã thấy rằng việc sử dụng jitclass, không đưa ra bất kỳ sự tăng tốc nào cho ví dụ của bạn. –

Các vấn đề liên quan