2013-06-14 36 views
6

Ngày tốt lành, tôi đang viết một mô-đun Python cho một số công việc số. Vì có rất nhiều thứ đang diễn ra, tôi đã dành vài ngày qua để tối ưu hóa mã để cải thiện thời gian tính toán. Tuy nhiên, tôi có một câu hỏi liên quan đến Numba. Về cơ bản, tôi có một lớp học với một số lĩnh vực mà là mảng NumPy, mà tôi khởi tạo theo cách sau:Python và Numba cho các hàm vectơ

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

Vì vậy, các mã được vector hóa, và sử dụng kết quả JIT Numba trong một số cải tiến. Tuy nhiên, đôi khi tôi cần truy cập hàm calculate_vibr_energy từ bên ngoài lớp và chuyển một số nguyên thay vì một mảng thay cho i. Theo như tôi hiểu, nếu tôi sử dụng JIT của Numba trên calculate_vibr_energy, nó sẽ phải luôn luôn lấy một mảng làm đối số. Vì vậy, tùy chọn nào sau đây là tốt hơn: 1) Tạo hàm mới calculate_vibr_energy_single (i), nó sẽ chỉ lấy một số nguyên duy nhất, và sử dụng Numba trên nó quá 2) Thay thế tất cả các chức năng của hàm tương tự như này:

myclass.calculate_vibr_energy(1) 

với điều này:

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

hoặc là có khác, hiệu quả hơn (hoặc ít nhất, hơn Python-ic) cách để làm điều đó?

+2

Anh ấy có nghĩa là tê giác. numba là một trình biên dịch JIT cho numpy: https://github.com/numba/numba –

+0

Một tùy chọn thứ ba có thể là để vượt qua một mảng chiều dài 1 thay vì một số nguyên. – Bitwise

Trả lời

1

Tôi chỉ chơi một chút với tê giác, vì vậy tôi có thể bị nhầm lẫn, nhưng theo như tôi đã hiểu, sử dụng trang trí "autojit" sẽ cung cấp các chức năng có thể lấy đối số của bất kỳ loại nào.

Xem ví dụ: http://numba.pydata.org/numba-doc/dev/pythonstuff.html

+0

Cảm ơn! Điều này có vẻ là cách đơn giản nhất (và dễ đọc) để làm điều đó. –

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