gpt4 book ai didi

python - 如何使用 Numpy 优化使用连续值的 for 循环?

转载 作者:行者123 更新时间:2023-12-04 14:08:38 24 4
gpt4 key购买 nike

我正在尝试创建一个返回 numpy.array 的函数与 n 0 和 1 之间的伪随机均匀分布数。所用方法的详细信息可以在这里找到:https://en.wikipedia.org/wiki/Linear_congruential_generator

到目前为止,效果很好。唯一的问题是每个新值都是通过使用前一个值计算的,所以到目前为止我发现的唯一解决方案是使用循环,为了效率起见,我试图摆脱该循环,可能是通过向量化操作 - 但是,我不知道该怎么做。

您对如何优化此功能有什么建议吗?

import numpy as np
import time

def unif(n):
m = 2**32
a = 1664525
c = 1013904223

result = np.empty(n)
result[0] = int((time.time() * 1e7) % m)

for i in range(1,n):
result[i] = (a*result[i-1]+c) % m

return result / m

最佳答案

虽然没有矢量化,但我相信以下解决方案大约快 2 倍(使用 numba 解决方案快 60 倍)。它保存每个 result作为局部变量,而不是按位置访问 numpy 数组。

def unif_improved(n):
m = 2**32
a = 1664525
c = 1013904223

results = np.empty(n)
results[0] = result = int((time.time() * 1e7) % m)

for i in range(1, n):
result = results[i] = (a * result + c) % m

return results / m

您也可以考虑使用 Numba 来进一步提高速度。 https://numba.pydata.org/

只是添加了装饰器 @jit对其他解决方案的打击。
from numba import jit

@jit
def unif_jit(n):
# Same code as `unif_improved`

计时
>>> %timeit -n 10 unif_original(500000)
715 ms ± 21.5 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

>>> %timeit -n 10 unif_improved(500000)
323 ms ± 8 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

>>> %timeit -n 10 unif_jit(500000)
12 ms ± 2.68 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

关于python - 如何使用 Numpy 优化使用连续值的 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52436436/

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