问题描述
我计时了两种方法来创建长度为 N 的元组.
I timed two ways to create a tuple of length N.
这非常快:
def createTuple():
for _ in range(100000):
tuplex = (0,) * 1000
CPU times: user 439 ms, sys: 1.01 ms, total: 440 ms
Wall time: 442 ms
这非常快,但不能用 Numba 编译:
This is very fast, but doesn't compile with Numba:
Invalid use of Function(<built-in function mul>) with argument(s) of type(s): (UniTuple(Literal[int](0) x 1), int64)
这要慢得多:
def createTuple():
for _ in range(100000):
tuplex = tuple(0 for _ in range(1000))
%time createTuple()
CPU times: user 5.28 s, sys: 3.28 ms, total: 5.29 s
Wall time: 5.29 s
并且也无法编译:
The use of yield in a closure is unsupported.
我对 Python 和 Numba 非常陌生.有没有办法使用 Numba 创建一个长度为 N(在编译时已知)的元组(希望有效地创建)?
I am very new to Python and Numba. Is there a way to get a tuple of length N (known at compile time) create - hopefully efficiently - with Numba?
推荐答案
来自 numba (0.50) 文档:
注意
不支持 tuple()
构造函数本身.
The tuple()
constructor itself is NOT supported.
因此,在 numba 代码中,元组需要作为函数参数提供或初始化为文字,如 (0, 1, 2, 3)
.这是不幸的,因为这意味着涉及数组形状的操作需要 numba 中的元组,即使它们在常规 numpy 中与 int 数组一起工作正常:
So, in numba code, tuples need to be either supplied as function arguments or initialized as literals, like (0, 1, 2, 3)
. This is unfortunate, because it means that operations involving array shapes require tuples in numba, even though they work fine with int arrays in regular numpy:
shape = np.arange(1, 4)
np.zeros(shape) # OK for normal python code, not in an @njit function.
您必须重构代码才能在@njit 函数之外创建元组:
You'll have to refactor your code to have tuple creation outside the @njit function:
@njit
def foo(tup):
...
foo(tuple(np.zeros(100)))
不幸的是,tuple(np.zeros(100))
相对较慢.
Unfortunately, tuple(np.zeros(100))
is relatively slow.
这篇关于如何使用将用 numba 编译的代码有效地创建长度为 N 的元组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!