gpt4 book ai didi

f# - 使用 F# 根据另一个列表减少列表的最快方法

转载 作者:行者123 更新时间:2023-12-02 21:13:05 25 4
gpt4 key购买 nike

在 F# 中根据另一个列表中的项目删除一个列表中的项目的最有效方法是什么?

示例:
seq1 = ["蓝色"; “绿色的”; “红色的”; “绿色”...]
seq2 = ["苏打水"; “绿色的”; “流行”...]

seq1 最初有 50,000 个项目seq2 有 12 个,并且随着时间的推移,其大小继续增长

我想要做的是删除 seq1 的所有实例(如果该值在 seq2 中)

我有以下代码,它是我能做到的最慢的代码 - 这不是我想要的。

let result = seq1 |> Seq.filter(fun a -> (Seq.exists(fun name -> name = a) seq2) = false)

我正在尝试找到快速的方法来实现这一功能(无循环等)

谢谢:-)

最佳答案

如果seq1相对较长而seq2相对较短,那么您可以从seq2的元素创建一个集合,然后使用集合的Contains方法检查它是否包含指定的元素。使用 Seq.exists 在集合中查找比在序列中查找快得多。

我正在使用基于您的数字的简单脚本对此进行测试:

#time
let seq1 = Array.init 50000 (fun i -> ["blue"; "green"; "red"].[i%3])
let seq2 = Array.init 12 (fun i -> [ "soda"; "green"; "pop"].[i%3])

现在,这里有一些选项(我将它们包装在 for i in 1 .. 10 do 中以获得更合理的数字,然后将其除以 10):

// 15ms - this is the original version, but I added `Array.ofSeq` to materialize it
let result = seq1 |> Seq.filter(fun a ->
(Seq.exists(fun name -> name = a) seq2) = false) |> Array.ofSeq

// 12ms - this is using `Array.filter` directly, which turns out to be as slow
let result = seq1 |> Array.filter(fun a ->
(Seq.exists(fun name -> name = a) seq2) = false)

// 2ms - using `set.Contains` is much faster, even when we create the set each time
let l = set seq2
let result = seq1 |> Array.filter(fun a -> l.Contains a = false)

请注意,我没有将 set seq2 调用推出循环 - 如果这样做,它会更快(您只需在更改 seq2 时创建集合即可code> 然后你就可以保留它)。

关于f# - 使用 F# 根据另一个列表减少列表的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32363848/

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