gpt4 book ai didi

performance - Haskell 列表理解效率低吗?

转载 作者:行者123 更新时间:2023-12-03 18:25:21 24 4
gpt4 key购买 nike

我开始做Project Euler并到达problem number 9 .由于我使用 Project Euler 来学习 Haskell,因此我决定使用列表推导(如 Learn You A Haskell 所示)。我这样做了,GHCI 需要一段时间来计算出三元组,我认为这是正常的,因为涉及到计算。现在,昨天在工作中(我还不是专业的程序员)我正在和一位了解 VBA 的 friend 交谈,他想尝试在 VBA 中找到答案。我认为这也是一个有趣的挑战,我编写了一些基本的 for 循环和 if 语句,但让我感动的是它比 Haskell 快得多。

我的问题是:Haskell 的列表理解效率非常低吗?起初我以为只是因为我在 GHC 的交互模式下,但后来我意识到 VBA 也是解释的。

请注意,我没有发布我的代码,因为它是对项目 euler 的回答。如果它会回答我的问题(就像我做错了什么),那么我会很乐意发布代码。

[编辑]
这是我的 Haskell 列表理解:[(a,b,c) | c <- [1..1000], b <- [1..c], a <- [1..b], a+b+c=1000, a^2+b^2=c^2]
我想我本可以降低 c 的范围,但那是真正减慢它的原因吗?

最佳答案

对于这个问题,您可以做两件事,这可能会使您的代码变慢。一个是您如何尝试 a、b 和 c 的值。如果您遍历 a、b、c 从 1 到 1000 的所有可能值,您将花费很长时间。为了给出提示,如果您将其重新排列为 c,则可以使用 a+b+c=1000。另一个是如果你只使用列表推导,它将处理 a、b 和 c 的所有可能值。这个问题告诉你只有一组唯一的数字可以满足这个问题,所以如果你改变你的答案:

[ a * b * c | .... ]

至:
head [ a * b * c | ... ]

那么 Haskell 的惰性求值意味着它会在找到第一个答案后停止。当您找到第一个答案时,这相当于打破您的 VBA 循环的 Haskell。当我使用这两个技巧时,我得到了一个在 ghci 中很快(不到一秒)完成的答案。

附录:我一开始错过了条件 a < b < c。您也可以在列表推导中使用它;可以这样说:
[(a, b) | b <- [1..100], a <- [1..b-1]]

关于performance - Haskell 列表理解效率低吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5351586/

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