我正在使用 Haskell 制作一个 Verlet 积分器来模拟重力。积分器使用对象的前两个位置作为种子,然后生成其余位置。
我认为在 Haskell 中实现这一点的一个好方法是使用无限列表。但是,当实现时,我发现它运行很慢很长时间(Haskell 1700 时间步:12 秒,Python 1700 时间步:< 1 秒)
以下是具有类似性能的一维积分器的相关代码:
verletStep dt acc xn xn1 = 2*xn1 - xn + (acc xn1)*dt*dt
verlet dt acc x0 x1 = x0 : x1 : next (verlet dt acc x0 x1)
where
next (xn : xs@(xn1:_)) = (verletStep dt acc xn xn1) : next xs
我也尝试使用zipWith
来生成无限列表,但它具有相似的性能。
为什么这需要这么长时间?垃圾收集本身大约需要 5 秒。有没有一种好方法可以让这个运行更快?