我听说将来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}}使用简单的解决方法吗?或者我应该等待下一个版本的改进?
如果没有解决方法,这不是一个大问题,我只是很好奇。
答案 0 :(得分:3)
如果你愿意,从根本上改善性能并不是特别困难。 scale!
只需要一个使用笛卡尔(多维)而不是线性索引的实现。目前,这确实意味着您必须使用Base.Cartesian
可能不熟悉的语法。
scale!
is here的核心代码。您可能希望它看起来更像this implementation of copy!
。函数体实际上会改变两个字符(将s*
添加到该赋值的RHS中)。
当然,如果您想坚持使用Julia 0.3,最好的办法就是使用自己的自定义实现。