我想使用 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)
最佳答案
如果您只是处理一维数组,那么您可以使用以下方法,其中数组必须在函数外部实例化。在这里似乎没有任何理由使用 vectorize
,您可以简单地使用 jit
来实现目标,尽管您必须使用显式地在数组元素上编写循环这。如果您的数组始终是一维的,那么您可以使用:
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)
关于python - Numba 对没有输入的函数进行向量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51137573/