Scala'for'表达式中多个生成器的性能?

时间:2017-09-14 09:53:29

标签: performance scala for-loop for-comprehension

一个例子:

for(x <- c1; y <- c2; z <- c3) yield {...}

可以翻译成:

c1.flatMap(x => c2.flatMap(y => c3.map(z => {...})))

或:

for(x <- c1) for (y <- c2) for (z <- c3) yield {...}

根据第二次翻译,时间复杂度 O(c1 * c2 * c3),如果c1,c2,c3是非常大的数字怎么办?

我试图在互联网上搜索,我发现有很多代码比这个例子有更多的生成器。

问题:在其他语言中,我们希望避免使用嵌套for循环,但为什么scala设计了这种机制,因为它有一些特殊的技巧可以为嵌套循环提供非常好的性能?

如果我误解了某些内容,请告诉我,我想更好地了解scala中的理解。谢谢。

1 个答案:

答案 0 :(得分:1)

为什么人们可能希望避免嵌套循环有两个原因。第一个是代码的可读性和质量(特别是在OOP中)。第二,如你所说,表现,但这不是一个硬性规则。这更像是一个指标,你可能在这个地方有较慢的代码,值得验证是否有可能更快地做同样的事情。显然,许多问题只需要Thu Sep 07 2017 01:59:59 GMT+0200 (CEST)个步骤,如果使用嵌套循环或其他方式实现它并不重要。例如。最简单的情况是,如果您有两个大小为O(n^2)的集合,并且您想打印所有对(笛卡尔积),则只需要n个步骤即可。

请记住,Scala中的for-comprehension不仅仅是其他语言的O(n^2)指令的替代品。它为您提供了一种使用Monads并编写更易读的代码的好方法。在for中包含多个表达式并不一定意味着您在此处遇到性能问题。