gpt4 book ai didi

scala - 当您并不总是需要检查列表的所有元素时,您如何提高 foldLeft(或 scanLeft)的性能?

转载 作者:行者123 更新时间:2023-12-03 21:00:37 26 4
gpt4 key购买 nike

例如,如果您有数百万个元素,但通常只需要检查前一百万个(例如,如果您正在累积一个总和并且您在某个最大值处饱和,或者您正在构建一些其他复杂的数据结构,但您在检查后完成前 M 个元素)。 FoldLeft 总是强制您遍历整个序列。理想情况下,您可以提供一个谓词,让 foldLeft 知道您已完成。

如果 scanLeft 被懒惰地评估(?),也许 scanLeft 与查找(查找第一个有效元素)一起可以完成此操作。我相信像这样的东西可以在 Haskell 中工作,但不确定 Scala。

numbers.scanLeft(0)((a, b) => a + b).find(_ >= 100)

所以如果 numbers = List(100,0,9,10),那么 scanLeft 只会查看第一个元素。

最佳答案

scanLeft为已经惰性的集合生成惰性集合,例如 迭代器 懒人列表 ( Strem 之前 2.13)。因此,您可以使用它来提前中止。
例如:

LazyList.continually(100)
.scanLeft(0) { case (acc, n) => acc + n }
.takeWhile(_ < 1000)
.toList
// res: List[Int] = List(0, 100, 200, 300, 400, 500, 600, 700, 800, 900)

List(0, 100, 5, 300)
.iterator
.map(i => { println(i); i })
.scanLeft(0) { case (acc, n) => acc + n }
.find(_ >= 100)
// 0
// 100
// res: Option[Int] = Some(100)

关于scala - 当您并不总是需要检查列表的所有元素时,您如何提高 foldLeft(或 scanLeft)的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59867149/

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