gpt4 book ai didi

performance - F# 性能错误?

转载 作者:行者123 更新时间:2023-12-01 23:19:18 26 4
gpt4 key购买 nike

let test1fun x = [for i in 1..x-> i]

let test2fun x y= [for i in 1..x
do for i in 1..y-> i]

let singlesearcher i =
let rec searcher j agg =
if j > i
then agg
else searcher (j+1) (i::agg)
searcher 1 []


let doublesearcher i j =
let rec searcher k l agg =
if k > i
then searcher 1 (l+1) agg
else if l > j
then agg
else searcher (k+1) l ((k,l)::agg)
searcher 1 1 []

使用#time 和 10000 执行上面的所有输入产量

list comprehension/singlesearcher-> negligable
cross product -> 320
list comprehension crossproduct -> 630

为什么嵌套列表理解是函数式版本的两倍多?

最佳答案

是的。列表理解通常比直接使用 F# 列表或数组慢。 (在我的机器上,我也发现了与你相似的时间。)

让我们看看它们是如何实现的。列表理解版本实际上相当复杂:

  1. 一个序列/IEnumerable<int>是使用理解语法创建的。这只是一个懒惰的序列,这里花的时间很少。

  2. 然后使用 Seq.toList 之类的东西将此序列转换为 F# List .实际时间都花在这里。有很多HasNext MoveNextswitch (state)就像这里执行的代码一样。有这么多函数调用,你不能指望它很快。

而功能版doublesearcher被适本地优化为尾递归。这是一个比列表理解更直接的版本,其中使用了很少的函数调用。

如果操作不是很关键,通常我们不会关心序列、列表或数组的这些小的性能差异。我认为在你的例子中,这一代人无论如何都是一次性的。两次计时问题不大。对于其他情况,例如两个向量的点积,使用数组可以节省很多时间,因为这个操作被执行了很多次。

关于performance - F# 性能错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6007564/

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