【发布时间】:2020-03-26 07:09:09
【问题描述】:
我可以使用 Zipped 函数进行元素运算,例如求和。让我有两个列表 L1 和 L2 如下所示
val L1 = List(1,2,3,4)
val L2 = List(5,6,7,8)
我可以通过以下方式逐元素求和
(L1,L2).zipped.map(_+_)
结果是
List(6, 8, 10, 12)
正如预期的那样。
我在我的实际代码中使用 Zipped 函数,但它需要太多时间。实际上,我的列表大小超过 1000,并且我有超过 1000 个列表,而且我的算法是迭代的,其中迭代可能高达 10 亿 .
在代码中我必须做以下事情
list =( (L1,L2).zipped.map(_+_).map (_ * math.random) , L3).zipped.map(_+_)
L1、L2和L3的尺寸相同。此外,我必须在集群上执行我的实际代码。
在 Scala 中获取列表元素和的最快方法是什么?
【问题讨论】:
-
如果您正在寻找运行时效率,请考虑使用数组而不是列表。
-
@AndriyPlokhotnyuk 我尝试用数组更改列表,但我认为这不会提高速度。
-
为了提高效率,使用预先分配的数组来存储临时结果,并使用 while 循环和按索引访问对它们进行操作。
-
此外,我建议不要发明轮子,而是使用一些高效的线性代数库,例如:github.com/scalanlp/breeze
-
如果您对性能不满意,请尝试基于 SIMD 的解决方案,例如:astojanov.github.io/blog/2017/12/20/scala-simd.html
标签: scala list performance apache-spark elementwise-operations