Scala性能问题
发布时间:2020-12-16 21:34:11 所属栏目:安全 来源:网络整理
导读:在 article written by Daniel Korzekwa年他表示下列代码: list.map(e = e*2).filter(e = e10) 比使用Java编写的迭代解决方案要差得多. 任何人都可以解释为什么?而Scala中的这种代码最好的解决方法是什么(我希望它不是Scala的Java迭代版本)? 解决方法 特
在
article written by Daniel Korzekwa年他表示下列代码:
list.map(e => e*2).filter(e => e>10) 比使用Java编写的迭代解决方案要差得多. 任何人都可以解释为什么?而Scala中的这种代码最好的解决方法是什么(我希望它不是Scala的Java迭代版本)? 解决方法
特定代码缓慢的原因是因为它正在使用原语,但它使用通用操作,因此原语必须被包装. (如果列表和它的祖先是专门的,这可以改进).这可能会减慢5倍左右的事情.
而且,在算法上,这些操作有点贵,因为你整个列表,然后使一个全新的列表抛出中间列表的几个组件.如果你这样做,那么你会更好.你可以这样做: list collect (case e if (e*2>10) => e*2) 但是如果计算e * 2真的很贵?那你可以 (List[Int]() /: list)((ls,e) => { val x = e*2; if (x>10) x :: ls else ls } 除了这将向后看. (如果需要,您可以将其反转,但这需要创建一个新的列表,这再次不是理想的). 当然,如果您使用单链表,您将会遇到与Java相同的算法问题 – 您的新列表将会向后退出,或者您必须先创建两次,首先反向,然后转发,或者您有使用(非尾)递归来构建它(在Scala中很容易,但是对于任何一种语言中的这种事情都是不合适的,因为你会耗尽堆栈),或者你必须创建一个可变列表,然后假装它是不可变(其中,顺便说一下,您可以在Scala中执行 – 请参阅mutable.LinkedList.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |