gpt4 book ai didi

python - 如何在 Python 中正确使用 njit/jit?

转载 作者:行者123 更新时间:2023-12-05 07:21:27 26 4
gpt4 key购买 nike

我正在尝试编写一个用于值函数迭代的程序,并且我想利用 numba 库中的 nopython 模式。下面的代码并没有真正做任何事情(我想从头开始了解我在哪里犯了错误)。它应该只返回我在函数中创建的矩阵。函数中的输入是我稍后要做的优化所必需的。但是,我遇到了错误(请参阅下文)。

我尝试使用@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: Invalid use of Function() with argument(s) of type(s): (array(float64, 2d, C)) * parameterized In definition 0: TypingError: array(float64, 2d, C) not allowed in a homogeneous sequence raised from C:\Anaconda3\lib\site-packages\numba\typing\npydecl.py:460 In definition 1: TypingError: array(float64, 2d, C) not allowed in a homogeneous sequence raised from C:\Anaconda3\lib\site-packages\numba\typing\npydecl.py:460 This error is usually caused by passing an argument of a type that is unsupported by the named function. [1] During: resolving callee type: Function() [2] During: typing of call at C:/Users/Jung Hwan Kim/Dropbox/StudentDebtCrisis/Program/Python/July012019/practice.py (124)

我想我可以使用 numpy 来创建数组并在 njit 模式下使用它们。或者我可能误解了 njit 的基本用法。非常感谢您的帮助。非常感谢!

最佳答案

我也在学习 numba。

一般来说,一开始最好保留默认的装饰器。但是,我看到了一些主题。

  1. 用 np.empty 创建一个空的颠簸数组。例子
v0 = np.empty((enum, bnum))
  • 为了更好的性能,你可以声明数据类型
v0 = np.empty((enum, bnum), dtype=np.float64)
  1. 没有精度和q变量

为简单起见,我将在您的 huggettgegm 函数中使用前 4 个变量

@jit([(int32, float64[:], float64[:,:], float64, )], nopython=True)
def huggettqegm(enum, egrid, pie, beta,):

v_I = np.empty((enum, bnum), dtype=np.float64)
g_I = np.empty((enum, bnum), dtype=np.float64)


return v_I, g_I


v, g = huggettqegm(enum, egrid, pie, beta,)

问题出在输出数据类型上,当你创建一个 np.array numpy 分析值并采用默认数据类型时,因为你需要一个空列表最好使用 np.empty 并根据需要声明数据类型,然后更改值。

numpy empty

关于python - 如何在 Python 中正确使用 njit/jit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56911436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com