我想使用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)
答案 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)