如何使用NumPy加速Python中依赖前项的序列计算?
用NumPy加速累积乘积序列计算
当然可以,而且效率提升会很明显。你的代码本质是计算累积乘积序列,每一项依赖前一项的结果,这种场景正好可以用NumPy的向量化操作替代Python循环,避开Python循环的解释器开销。
具体实现步骤:
- 一次性生成所有[20,35]范围内的整数随机数(注意NumPy的
randint是左闭右开区间,所以要把上限设为36才能包含35) - 用NumPy的
cumprod()直接计算累积乘积,一步得到整个序列
替换后的代码:
import numpy as np number_points = 10000 # 生成对应范围的随机整数数组 random_arr = np.random.randint(20, 36, size=number_points) # 计算累积乘积,得到和原代码完全一致的序列 xx = random_arr.cumprod()
为什么更快?
Python的for循环是在解释器层面逐次执行,而NumPy的randint和cumprod都是底层用C实现的向量化操作,能充分利用CPU的并行计算能力,尤其是当number_points很大(比如10万、100万)时,速度差距会非常显著。
这里的cumprod结果和原代码的xx完全等价——原代码初始x=1,第一次循环后x=1*第一个随机数,正好对应random_arr[0],后续每一步的累积乘积也和原循环逻辑完全对齐。
内容的提问来源于stack exchange,提问作者Alen
相关产品推荐
相关产品推荐

