PyTorch能否通过张量操作实现动态规划式串行递推计算?
带串行依赖的递推计算的张量实现
这类存在前序值依赖的递推计算,完全可以通过张量操作实现等效功能,不需要手动编写Python层的逐元素循环。
原循环的本质逻辑拆解
你写的循环本质是线性递推关系:
- 序列初始值固定为
a[0] = 1 - 从索引1开始,每一位的取值满足
a[i] = a[i-1] + b[i]
展开后可以发现,最终的a序列,就是a[0]加上从b[1]开始逐元素累加的前缀和序列。
最简化的张量实现
直接调用PyTorch内置的torch.cumsum前缀和算子即可完全复现循环逻辑,代码如下:
import torch a = torch.Tensor([1, 0, 0, 0]) b = torch.Tensor([1, 2, 3, 4]) # 计算从索引1开始的b元素的前缀和,叠加序列初始值 cumsum_segment = torch.cumsum(b[1:], dim=0) + a[0] # 拼接初始首值,得到最终结果 result = torch.cat([a[:1], cumsum_segment]) print(result) # 输出 tensor([ 1., 3., 6., 10.]),和原循环输出完全一致
这种实现的性能远高于Python层的for循环:cumsum是PyTorch底层高度优化的算子,在CPU/GPU上都可以并行执行计算,长序列场景下的速度差距会非常明显。
关于串行类动态规划计算的说明
- 对于满足固定线性递推关系的计算,都可以拆解为可向量化的张量操作完成,不需要逐元素循环
- 对于递推逻辑更复杂、存在非线性依赖的场景,也可以通过PyTorch提供的原生张量级串行算子实现,不需要退化为Python层的逐元素遍历
内容的提问来源于stack exchange,提问作者erksch
相关产品推荐
相关产品推荐

