Performance 列表理解中的绩效(处理时间)影响因素是什么?
在学习learn-you-a-haskell的例子时,“哪个直角三角形 所有边和小于等于10的所有边的整数周长为24?“ rightTrianglesOriginal=[(a,b,c)| cb?]Performance 列表理解中的绩效(处理时间)影响因素是什么?,performance,haskell,functional-programming,Performance,Haskell,Functional Programming,在学习learn-you-a-haskell的例子时,“哪个直角三角形 所有边和小于等于10的所有边的整数周长为24?“ rightTrianglesOriginal=[(a,b,c)| cb?] 在谓词(1)a>b和(2)c>a的基础上列出元组,然后进一步应用a^2+b^2=c^2是否会提高总体性能 如果我们更改参数位置,例如(a、b、c)或(c、b、a),是否会对性能产生影响 如果需要这种大量的排列和组合,那么在实际应用中,什么是可取的策略?我们是否应该存储预先计算的答案(尽可能)以供下次使
b
和a
之间添加一个b
测试将生成器更改为快捷方式。当然,是否将生成器更改为b,c>a,c>b
?)
是的,但通常很少,除非谓词的计算成本非常高。在上述情况下,如果谓词保持不变,则会对隐含的第三个谓词进行不必要的计算。在这里,对于标准数字类型,谓词的计算成本很低,并且不会经常进行计算(大多数候选三元组都会更早失败),因此影响很难测量。但这是额外的工作要做-编译器没有足够的智能来消除它-因此它需要额外的时间
- 在谓词(1)
和(2)a>b
的基础上列出元组,然后进一步应用a^2+b^2=c^2是否会提高总体性能c>a
b
之前获取a
,这样您就可以缩短c>a
)。比较的计算成本也比A^2+b^2==c^2
要低一些,因此即使测试的总数增加(后一种情况比前一种情况省去了更多的三倍),也可以先进行更便宜的测试来提高性能(但首先进行最具辨别力的测试也可能是更好的策略,即使测试成本更高,这取决于成本和功耗之间的关系)
- 如果我们更改参数位置,例如
或(a,b,c)
,是否会对性能产生影响(c,b,a)
- 如果需要大量的排列和组合,那么在实际应用中,什么是可取的策略?我们是否应该存储预先计算的答案(尽可能)以供下次使用,以提高性能或其他用途
rightTriangles10 = [ (a,b,c) | c <- [1..10], b <- [1..10], a <- [1..10], a^2 + b^2 == c^2, a > b , c > a]
rightTriangles10=[(a,b,c)| c当我运行函数时,我没有得到这个“(2.64秒,2012018624字节)。如何获得处理时间?字节值代表什么?目前,我使用的是“WinGHCi 1.0.6)。请注意,所用的时间与您提到的差不多。我将更正问题中的错误。在ghci中,在提示符处键入:set+s
,以获取时间统计信息。字节值度量分配,但我不确定具体内容以及它是否有用。对于任何重要的度量,无论如何都应使用优化进行编译。
rightTrianglesSwapped = [ (a,b,c) | c <- [1..10], b <- [1..10], a <- [1..10], a+b+c == 24, a^2 + b^2 == c^2]
rightTriangles10 = [ (a,b,c) | c <- [1..10], b <- [1..10], a <- [1..10], a^2 + b^2 == c^2, a > b , c > a]
rightTriangles100 = [ (a,b,c) | c <- [1..100], b <- [1..100], a <- [1..100], a^2 + b^2 == c^2, a > b , c > a]
rightTriangles1000 = [ (a,b,c) | c <- [1..1000], b <- [1..1000], a <- [1..1000], a^2 + b^2 == c^2, a > b , c > a]
ghci> [ (a,b,c) | c <- [1..100], b <- [1..100], a <- [1..100], a^2 + b^2 == c^2, a > b , c > a]
[(4,3,5),(8,6,10),(12,5,13),(12,9,15),(15,8,17),(16,12,20),(24,7,25),(20,15,25),(24,10,26)
,(21,20,29),(24,18,30),(30,16,34),(28,21,35),(35,12,37),(36,15,39),(32,24,40),(40,9,41)
,(36,27,45),(48,14,50),(40,30,50),(45,24,51),(48,20,52),(45,28,53),(44,33,55),(42,40,58)
,(48,36,60),(60,11,61),(63,16,65),(60,25,65),(56,33,65),(52,39,65),(60,32,68),(56,42,70)
,(55,48,73),(70,24,74),(72,21,75),(60,45,75),(72,30,78),(64,48,80),(80,18,82),(84,13,85)
,(77,36,85),(75,40,85),(68,51,85),(63,60,87),(80,39,89),(72,54,90),(84,35,91),(76,57,95)
,(72,65,97),(96,28,100),(80,60,100)]
(2.64 secs, 2012018624 bytes)
ghci> length [(a,b,c) | c <- [2 .. 1000], b <- [1 .. c-1], a <- [c-b+1 .. b], a*a + b*b == c*c]
881
(87.28 secs, 26144152480 bytes)