Numba向量化功能,无需输入

时间:2018-07-02 13:39:44

标签: python numpy vectorization numba

我想使用numba.vectorize并行化一个函数,但是我的函数不接受任何输入。目前,对于我从未使用过的函数,我使用了伪数组和伪输入。

是否有更优雅/更快捷的方式(可能不使用numba.vectorize)?

代码示例(不是我的实际代码,仅用于演示如何丢弃输入):

import numpy as np
from numba import vectorize

@vectorize(["int32(int32)"], nopython=True)
def particle_path(discard_me):
    x = 0
    for _ in range(10):
        x += np.random.uniform(0, 1)
    return np.int32(x)

arr = particle_path(np.empty(1024, dtype=np.int32))
print(arr)

1 个答案:

答案 0 :(得分:2)

如果仅处理一维数组,则可以使用以下代码,其中必须在函数外部实例化该数组。这里似乎没有任何理由使用vectorize,尽管您必须使用此方法显式地编写数组元素上的循环,但您可以使用jit来简单地实现目标。如果您的阵列始终为1D,则可以使用:

import numpy as np
from numba import jit

@jit(nopython=True)
def particle_path(out):
    for i in range(len(out)):
        x = 0
        for _ in range(10):
            x += np.random.uniform(0, 1)
        out[i] = x

arr = np.empty(1024, dtype=np.int32)
particle_path(arr)

您可以使用flat属性来处理任何维数组(并确保使用.size来获取数组中元素的总数)

@jit(nopython=True)
def particle_path(out):
    for i in range(out.size):
        x = 0
        for _ in range(10):
            x += np.random.uniform(0, 1)
        out.flat[i] = x

arr = np.empty(1024, dtype=np.int32)
particle_path(arr)

最后,如果每次运行该函数都需要一个新数组,则可以在函数内部创建数组(如果要重复调用该函数并希望覆盖同一数组,请使用上述方法,这样可以保存该数组时间来一次又一次地重新分配相同的数组。

@jit(nopython=True)
def particle_path(num):
    out = np.empty(shape=num, dtype=np.int32)
    for i in range(num):
        x = 0
        for _ in range(10):
            x += np.random.uniform(0, 1)
        out[i] = x
    return out

arr = particle_path(1024)