Как правильно использовать njit/jit в Python?Python

Программы на Python
Anonymous
Как правильно использовать njit/jit в Python?

Сообщение Anonymous »

Я пытаюсь написать программу для итерации функции значения и хочу использовать режим nopython из библиотеки numba. Код ниже на самом деле ничего не делает (я хотел начать с самого начала, чтобы понять, где я делаю ошибку). Он должен просто возвращать матрицы, которые я создаю в функции. Входные данные функции необходимы для оптимизации, которую я сделаю позже. Однако я столкнулся с ошибкой (см. ниже).

Я попробовал использовать @njit, а также @jit, который включает определенный тип, который я использую для каждого входа. Однако оба не работают.

Код: Выделить всё

import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d
import time
from datetime import timedelta
from numba import jit, njit, int32, float64
from gridlookup import gridlookup

beta = 0.99322
sigma = 1.5
enum = 2
egrid = np.array([0.1, 1.0])
pie = np.array([[0.5, 0.5],
[0.075, 0.925]])
blow = -2.0; bhigh = 4.0; bnum = 10
bgrid = np.logspace(np.log(blow + -1.0*blow + 1.0)/np.log(10.0), np.log(bhigh + -1.0*blow + 1.0)/np.log(10.0), bnum)
bgrid = bgrid + np.ones(np.shape(bgrid))*(blow - 1.0)
mubgnum = 1000
mubgrid = np.linspace(blow, bhigh, mubgnum)

v0 = np.array(np.zeros((enum,bnum)))

@njit
def vfini(bnum, enum, bgrid, egrid, v0):
## calculate the initial value function.
for i in range(bnum):
bval = bgrid[i]
for m in range(enum):
eval0 = egrid[m]
yval = 0.025*bval + eval0
v0[m,i] = (yval**(1-sigma))/(1.0-sigma)

return v0

v0 = vfini(bnum, enum, bgrid, egrid, v0)

@jit([(int32, float64[:], float64[:,:], float64, float64, int32,
float64[:], int32, float64[:], float64, float64[:,:],float64)],nopython=True)
def huggettqegm(enum, egrid, pie, beta, sigma, bnum,
bgrid, mubgnum, mubgrid, precision, v0, q):

v_I = np.array(np.zeros((enum,bnum)))
g_I = np.array(np.zeros((enum,bnum)))
tv_I = np.array(np.zeros((enum,bnum)))
tg_I = np.array(np.zeros((enum,bnum)))

return v_I, g_I

q = qlow

v, g = huggettqegm(enum, egrid, pie, beta, sigma, bnum, bgrid, mubgnum, mubgrid, precision, v0, q)
Ниже показано сообщение об ошибке при запуске простого кода, приведенного выше:


TypingError: Недопустимое использование Function() с
аргументами типа(ов): (array(float64, 2d, C)) * параметризовано В
определении 0:
TypingError: array(float64, 2d, C) не допускается в однородной последовательности
, полученной из C:\Anaconda3\lib\site-packages\numba\typing\npydecl.py:460 В
определении 1:
Ошибка TypingError: массив (float64, 2d, C) не разрешен в однородной последовательности
, полученной из C:\Anaconda3\lib\site-packages\numba\typing\npydecl.py:460 Эта ошибка
обычно вызывается передачей аргумента типа, который не поддерживается
именованной функцией. [1] Во время: определение типа вызываемого абонента:
Function() [2] Во время: ввод вызова в
C:/Users/Jung Hwan
Kim/Dropbox/StudentDebtCrisis/Program/Python/ июля012019/practice.py
(124)


Я подумал, что смогу использовать numpy для создания массива и использовать его в режим нджита. Или, может быть, я неправильно понимаю основы использования njit. Буду очень признателен за вашу помощь. Спасибо большое!

Подробнее здесь: https://stackoverflow.com/questions/569 ... -in-python

Вернуться в «Python»