python haskell 使用对比_如何加快我的Haskell程序(到Python的程度)

我有以下玩具程序循环移动一个向量并将其添加到自己(在mod下)。它为不同的移位和大量的迭代(与向量的大小相比)。节目作品,但它的狗慢。我还在学习哈斯克尔,所以我的问题是:我做错了什么?

import Data.List (foldl')

import qualified Data.Sequence as Seq

import Data.Sequence (index, zipWith, Seq, (>))

seqSize = 100

numShifts = 10000

cycleShift :: Integer -> Seq a -> Seq a

cycleShift s l = Seq.drop (fromInteger s) l >< Seq.take (fromInteger s) l

modAdd :: Seq Integer -> Seq Integer -> Seq Integer

modAdd s t = Seq.zipWith (\ a b -> (a + b) `mod` 10^16) s t

step :: Seq Integer -> Integer -> Seq Integer

step l shift = modAdd l (cycleShift shift l)

allshifts = [i `mod` seqSize |i

start = Seq.fromList (1 : [0 | i

end = foldl' step start allshifts

main :: IO ()

main = print (Seq.index end 0)

Python中的程序相同

seq_size = 100

num_shifts = 10000

S = [i % seq_size for i in xrange(1, num_shifts + 1)]

ssums = [1] + [0 for i in range(seq_size - 1)]

for s in S:

shift = ssums[s:] + ssums[:s]

ssums = [(ssums[i] + shift[i]) % 10**16 for i in range(seq_size)]

print ssums[0]

这是时间。

Haskell:real 0m5.596s

Python:真正的0m0.551s

Python的速度并不知名,但是x10倍快?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值