如何编译具有可变输入类型的 numba jit'ed 函数?
How to compile a numba jit'ed function with variable input type?
假设我有一个函数可以接受 int
或 None
类型作为输入参数
import numba as nb
import numpy as np
jitkw = {"nopython": True, "nogil": True, "error_model": "numpy", "fastmath": True}
@nb.jit("f8(i8)", **jitkw)
def get_random(seed=None):
np.random.seed(None)
out = np.random.normal()
return out
我希望函数只是 return 一个正态分布的随机数。如果我想要可重现的结果,种子应该是 int
.
get_random(42)
>>> 0.4967141530112327
get_random(42)
>>> 0.4967141530112327
get_random(42)
>>> 0.4967141530112327
如果我想要随机数,seed
应该保留为 None
。但是,如果我不传递参数(因此种子默认为 None
)或显式传递 seed=None
,则 numba 会引发 TypeError
get_random()
>>> TypeError: No matching definition for argument type(s) omitted(default=None)
get_random(None)
>>> TypeError: No matching definition for argument type(s) omitted(default=None)
如何编写函数,仍然声明签名并在这种情况下使用 nopython
模式?
我的numba版本是0.43.1
第一个问题是 nopython 模式下的 numba 只接受(从版本 0.43.1 开始)np.random.seed
: with an integer argument only。
所以,很遗憾,您无法传入 None
。
第二个问题是(据我所知)没有 "single" 签名告诉 numba 如何处理缺失值,但是您可以使用两个签名(是的,它非常冗长) :
import numba as nb
import numpy as np
jitkw = {"nopython": True, "nogil": True, "error_model": "numpy", "fastmath": True}
@nb.jit(
[nb.types.float64(nb.types.misc.Omitted(None)),
nb.types.float64(nb.types.int64)],
**jitkw)
def get_random(seed=None):
return np.random.normal()
简单说明签名的两部分:
-
nb.types.float64(nb.types.misc.Omitted(None))
告诉 numba 在省略参数 时使用 None
作为默认类型
- 并且
nb.types.float64(nb.types.int64)
是需要整数的签名。
就我个人而言,我不会指定签名,而只是让 numba 自行解决。显式签名在 numba 中很少值得,而且通常情况下它们会导致代码速度变慢且灵活性降低。
假设我有一个函数可以接受 int
或 None
类型作为输入参数
import numba as nb
import numpy as np
jitkw = {"nopython": True, "nogil": True, "error_model": "numpy", "fastmath": True}
@nb.jit("f8(i8)", **jitkw)
def get_random(seed=None):
np.random.seed(None)
out = np.random.normal()
return out
我希望函数只是 return 一个正态分布的随机数。如果我想要可重现的结果,种子应该是 int
.
get_random(42)
>>> 0.4967141530112327
get_random(42)
>>> 0.4967141530112327
get_random(42)
>>> 0.4967141530112327
如果我想要随机数,seed
应该保留为 None
。但是,如果我不传递参数(因此种子默认为 None
)或显式传递 seed=None
,则 numba 会引发 TypeError
get_random()
>>> TypeError: No matching definition for argument type(s) omitted(default=None)
get_random(None)
>>> TypeError: No matching definition for argument type(s) omitted(default=None)
如何编写函数,仍然声明签名并在这种情况下使用 nopython
模式?
我的numba版本是0.43.1
第一个问题是 nopython 模式下的 numba 只接受(从版本 0.43.1 开始)np.random.seed
: with an integer argument only。
所以,很遗憾,您无法传入 None
。
第二个问题是(据我所知)没有 "single" 签名告诉 numba 如何处理缺失值,但是您可以使用两个签名(是的,它非常冗长) :
import numba as nb
import numpy as np
jitkw = {"nopython": True, "nogil": True, "error_model": "numpy", "fastmath": True}
@nb.jit(
[nb.types.float64(nb.types.misc.Omitted(None)),
nb.types.float64(nb.types.int64)],
**jitkw)
def get_random(seed=None):
return np.random.normal()
简单说明签名的两部分:
-
nb.types.float64(nb.types.misc.Omitted(None))
告诉 numba 在省略参数 时使用 - 并且
nb.types.float64(nb.types.int64)
是需要整数的签名。
None
作为默认类型
就我个人而言,我不会指定签名,而只是让 numba 自行解决。显式签名在 numba 中很少值得,而且通常情况下它们会导致代码速度变慢且灵活性降低。