Numba 对没有输入的函数进行矢量化
Numba vectorize for function with no input
我想使用 numba.vectorize
并行化一个函数,但我的函数不接受任何输入。目前,我为从未使用过的函数使用虚拟数组和虚拟输入。
有没有更elegant/fast的方式(可能不用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)
我想使用 numba.vectorize
并行化一个函数,但我的函数不接受任何输入。目前,我为从未使用过的函数使用虚拟数组和虚拟输入。
有没有更elegant/fast的方式(可能不用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)