2

当有一个集合并且您必须对其所有元素执行两个或多个操作时,哪个更快?:

val f1: String => String  = _.reverse
val f2: String => String  = _.toUpperCase
val elements: Seq[String] = List("a", "b", "c")
  1. 迭代多次并在一个循环上执行一项操作

    val result = elements.map(f1).map(f2)

    这种方法确实有一个优点,即应用第一个函数后的结果可以被重用。

  2. 迭代一次并一起对每个元素执行所有操作

    val result = elements.map(element => f2(f1(element)))

    或者

    val result = elements.map(element => f1.compose(f2)

这两种方法的性能有什么区别吗?如果是,哪个更快?

4

2 回答 2

4

事情就是这样,集合的转换或多或少是运行时 O(N) ,* 应用的所有函数的运行时成本。因此,我怀疑您在上面提出的第二组选择会在运行时产生丝毫差异。您列出的第一个选项是另一回事。可以避免创建新的集合,因为这可能会导致开销。这就是“视图”集合的用武之地(参见我发现的这个好例子)

在 Scala 中,“视图”是做什么的?

如果您有应用多个映射操作,您可以这样做:

val result = elements.view.map(f1).map(f2).force

(最后的强制,导致所有函数评估)上面的第二组示例可能会快一点,但是如果您使用了很多这些或复杂的匿名函数,“视图”选项可以使您的代码更具可读性在映射中。

于 2013-10-12T23:37:05.943 回答
1

组合函数以产生单遍转换可能会获得一些性能,但很快就会变得不可读。考虑使用视图作为替代方案。虽然这将创建中间集合:

val result = elements.map(f1).map(f2)

这将执行惰性求值,并以与您相同的方式执行功能组合:

val result = elements.view.map(f1).map(f2)

请注意,结果类型将是SeqView,因此您可能希望稍后将其转换为列表toList

于 2013-10-12T23:48:33.923 回答