加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读