Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Haskell列表理解效率低吗?_Performance_Vba_Haskell_List Comprehension - Fatal编程技术网

Performance Haskell列表理解效率低吗?

Performance Haskell列表理解效率低吗?,performance,vba,haskell,list-comprehension,Performance,Vba,Haskell,List Comprehension,我开始做,然后开始做。因为我使用Project Euler学习Haskell,所以我决定使用列表理解(如中所示)。我这样做了,GHCI需要一段时间来计算出三重态,我认为这是正常的,因为计算涉及。现在,在昨天的工作中(我还不是专业的程序员),我和一个认识VBA的朋友聊天,他想尝试在VBA中找到答案。我认为这也是一个有趣的挑战,我编写了一些基本的for循环和if语句,但让我感到惊讶的是它比Haskell快得多 我的问题是:哈斯克尔的列表理解效率是否难以置信?起初我以为这只是因为我处于GHC的交互模式

我开始做,然后开始做。因为我使用Project Euler学习Haskell,所以我决定使用列表理解(如中所示)。我这样做了,GHCI需要一段时间来计算出三重态,我认为这是正常的,因为计算涉及。现在,在昨天的工作中(我还不是专业的程序员),我和一个认识VBA的朋友聊天,他想尝试在VBA中找到答案。我认为这也是一个有趣的挑战,我编写了一些基本的for循环和if语句,但让我感到惊讶的是它比Haskell快得多

我的问题是:哈斯克尔的列表理解效率是否难以置信?起初我以为这只是因为我处于GHC的交互模式,但后来我意识到VBA也被解释了

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

[编辑] 以下是我对Haskell列表的理解:

[(a、b、c)| c一旦你找到了问题的解决方案,你可以在Project Euler网站上查看其他人版本的Haskell solutions,了解其他人是如何解决问题的。顺便说一句,这里有一个指向参考问题的链接:

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

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

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

附录:我一开始遗漏了条件a
[(a, b) | b <- [1..100], a <- [1..b-1]]

[(a,b)| b考虑一下您的列表理解的简化版本:

[(a,b,c) | a <- [1..1000], b <- [1..1000], c <- [1..1000]]

[(a,b,c)| a除了其他人所说的在生成器中生成更少的元素外,您还可以切换到使用Int而不是Integer作为数字类型。默认值为Integer,但您的数字足够小,可以容纳Int


(另外,吹毛求疵的是,Haskell列表理解没有速度。Haskell是一种操作语义非常少的语言定义。不过,特定的Haskell实现可能具有缓慢的列表理解。)

列表编译不一定要慢。可能您的列表访问速度慢。这在很大程度上取决于您的代码。我曾经在Euler项目的Haskell中练习过,发现GHCi适合尝试一些东西,但当您需要解决方案时,您必须使用
ghc-O2
构建二进制。有很多优化规则只有在H~代码> -O。此外,您可以考虑查看一些高级代码优化的库(如<代码>流融合< /代码>)。.Fist:思考!Second:编写解决方案!这是Euler项目。你只是不假思索地编写了一个解决方案。Haskell中的列表理解并不慢。我在我的原始帖子中添加了我的列表理解。它看起来与你发布的内容类似,所以我不太确定。头部优化有助于你的版本,使其更快完成。你的版本优先于nts找出答案,然后继续进行相当长的时间,寻找其他答案。下面是对您的代码的一个小修改,我的其他建议几乎可以让它立即生效:
head[(a,b,c)| c一个小调整:您不需要从列表中绘制
a
。这样做:
head[(a,b,c)| c@user207442谢谢,我不知道你能把let嵌入这样的列表理解。谢谢尼尔和user207442的帮助。今晚我一定会试试。在我能与Haskell合作之前,我有很多东西要学:)谢谢你的回答。我感谢你的深思熟虑!
[(a,b,c) | a <- [1..1000], b <- [1..1000], c <- [1..1000]]
[(a,b,c) | c <- [1..1000], b <- [1..c], a <- [1..b], a+b+c=1000, a^2+b^2=c^2]