规模替代!对于SubArray对象

时间:2014-09-16 15:19:07

标签: julia

我听说将来SubArray和其他阵列操作都是eventually due for a performance overhaul。目前,由于SubArray速度慢,我的代码中有一些相当小的减速。这是一个例子:

A=rand(Float32,20000,20000);
B=sub(A,2:19999,2:19999);
@time scale!(A,0.2f0);
@time scale!(B,0.2f0);

导致

elapsed time: 0.245619038 seconds
elapsed time: 11.706939438 seconds

所以scale!在类似尺寸的SubArray上比在Array上慢约40-50倍。

我暂时可以在scale!的{​​{1}}使用简单的解决方法吗?或者我应该等待下一个版本的改进?

如果没有解决方法,这不是一个大问题,我只是很好奇。

1 个答案:

答案 0 :(得分:3)

如果你愿意,从根本上改善性能并不是特别困难。 scale!只需要一个使用笛卡尔(多维)而不是线性索引的实现。目前,这确实意味着您必须使用Base.Cartesian可能不熟悉的语法。

scale! is here的核心代码。您可能希望它看起来更像this implementation of copy!。函数体实际上会改变两个字符(将s*添加到该赋值的RHS中)。

当然,如果您想坚持使用Julia 0.3,最好的办法就是使用自己的自定义实现。