gpt4 book ai didi

haskell - 即使不再使用旧向量,是否也会创建新向量?

转载 作者:行者123 更新时间:2023-12-04 10:01:52 34 4
gpt4 key购买 nike

这个问题是关于 Data.Vector包裹。

鉴于一旦单元格更新,我将永远不会使用某个单元格的旧值。更新操作是否总是会创建一个新的向量来反射(reflect)更新,还是会作为就地更新完成?

注意:我知道Data.Vector.Mutable

最佳答案

不,但可能会发生更好的事情。

Data.Vector 是使用 "stream fusion" 构建的.这意味着如果您正在执行的构建然后拆除向量的操作序列可以被融合掉,那么向量本身将永远不会被构造你的代码将变成一个优化的循环。

Fusion 的工作原理是将构建向量的代码转换为构建和拆除流的代码,然后将流放入编译器可以看到以执行优化的形式。

所以看起来像的代码

foo :: Int
foo = sum as
where as, bs, cs, ds, es :: Vector Int
as = map (*100) bs
bs = take 10 cs
cs = zipWith (+) (generate 1000 id) ds
ds = cons 1 $ cons 3 $ map (+2) es
es = replicate 24000 0

尽管似乎建立和拆除了相当多的非常大的向量,但它们可以一直融合到一个只计算和添加 10 个数字的内部循环。

执行您建议的操作很棘手,因为它要求您知道在其他任何地方都不存在对术语的引用,这对将引用复制到环境中的任何尝试都施加了成本。此外,它与懒惰的相互作用相当差。您需要将一点仿射附录附加到您明显尚未评估的 thunk 上。但是在多线程环境中执行此操作很容易出现竞争并且很难做到正确。

关于haskell - 即使不再使用旧向量,是否也会创建新向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6665821/

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