【发布时间】:2020-01-27 21:57:14
【问题描述】:
我实现了这个答案的一个版本https://stackoverflow.com/a/9920425/1261166(我不知道回答的人的意图)
sublistofsize 0 _ = [[]]
sublistofsize _ [] = []
sublistofsize n (x : xs) = sublistsThatStartWithX ++ sublistsThatDontStartWithX
where sublistsThatStartWithX = map (x:) $ sublistofsize (n-1) xs
sublistsThatDontStartWithX = sublistofsize n xs
我不确定的是sublistsThatStartWithX = map (x:) $ sublistofsize (n-1) xs
我假设 map (x:) 在性能方面给出了问题,但不确定如何解决它。我已经对print $ length $ sublistofsize 5 $ primesToTakeFrom 50进行了分析
COST CENTRE MODULE no. entries %time %alloc %time %alloc
sublistofsize Main 112 4739871 46.9 39.9 96.9 100.0
sublistofsize.sublistsThatDontStartWithX Main 124 2369935 2.2 0.0 2.2 0.0
sublistofsize.sublistsThatStartWithX Main 116 2369935 47.8 60.1 47.8 60.1
我是否以一种好的方式实施它? 有没有更快的方法?
【问题讨论】:
-
您测量过性能问题吗?这个问题基本上是输出大小的线性问题,
map不会改变这一点。 -
我的想法是 map (x:) 使 x 挂起并等待递归调用的返回值,或者我错了......?
-
没有关系,因为 Haskell 很懒惰,但即使有,又有什么关系呢?这项工作必须在某个时候完成。
-
由于我不太擅长使用haskell 并寻找性能问题,我的猜测是那将是问题所在,也许是尾递归,我不知道。我制作了另一个更快的函数,它使用列表理解,但我的猜测是这会更快,因为我做了很多其他的事情,比如守卫,而且我在另一个版本中对素数没有限制(它检查所有( !)组合)
-
我认为您需要更清楚您的问题实际上是什么 - 例如是关于为什么与您的其他代码存在性能差异(如果有,请提供其他代码和测量的详细信息),是否有更快的方法来编写上述代码,还是什么?
标签: performance haskell