gpt4 book ai didi

python - Numba 对没有输入的函数进行矢量化

转载 作者:太空宇宙 更新时间:2023-11-04 02:23:02 24 4
gpt4 key购买 nike

我想使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com