How to efficiently create a tuple of length N with code that will compile with numba?

别说谁变了你拦得住时间么 提交于 2020-07-23 06:45:29

问题


I timed two ways to create a tuple of length N.

This is very fast:

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

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)

This is much slower:

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

And also fails to compile:

The use of yield in a closure is unsupported.

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?


回答1:


From the numba (0.50) documentation:

Note

The tuple() constructor itself is NOT supported.

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.

You'll have to refactor your code to have tuple creation outside the @njit function:

@njit
def foo(tup):
   ...

foo(tuple(np.zeros(100)))

Unfortunately, tuple(np.zeros(100)) is relatively slow.



来源:https://stackoverflow.com/questions/62852267/how-to-efficiently-create-a-tuple-of-length-n-with-code-that-will-compile-with-n

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!