lea*_*lia 8 vectorization broadcasting julia
我来自R和Matlab多年的julia,其中矢量化代码是性能的关键,并影响了我的思考.现在,阅读S. Johnson的这篇精彩博客文章"更多点"我确信朱莉娅的句法循环融合是该语言的一个很好的特征,但在移植我以前的矢量化代码时让我有点困惑.
将一些函数矢量化为几个参数是不好/差的形式?- 当我想迭代一个数组时,我是否应该编写所有例程的"标量"版本并调用点版本(或广播/地图)?
为了争论,请说我写下面的内容
function sphere_vol(r)
return 4/3*pi*r^3
end
Run Code Online (Sandbox Code Playgroud)
然后在另一个函数中使用它,
function density(N, r)
V = sphere_vol(r)
return N/V
end
Run Code Online (Sandbox Code Playgroud)
等等(很多函数互相调用).我的直觉(来自其他语言)是在方便时将大多数函数定义为矢量化,如sphere_vol(r) = 4/3*pi*r.^3(微不足道的变化).有没有任何意义,如果我可以自动调用sphere_vol.(r::Array)(或map(sphere_vol, r::Array)?对于单参数函数,这不是一个重要的决定,但对于多个参数,它可以显着改变实现:我可以定义矢量化的density(N, r)矢量化版本以上r,或通过N,或两者(返回矩阵),但它更琐碎写这种方式(需要通过调用内部的广播sphere_vol.()和./),在R和Matlab的我做出了这个选择对案件逐案基础上与此妥协:
矢量化更方便,更有效:我可以调用density(N::Vector, r::Vector)一次并获得完整的数组值.
在几个参数上写一个矢量化函数很快变得很麻烦和/或难以管理(2个参数通常可以用一些技巧); 特别是当返回值不是标量时.
在朱莉娅实施新功能时,我不知道如何进行判断.
如果说在朱莉娅,我最好只编写上面的"标量"版本吗?或者,如果对某些参数进行矢量化(例如Bessel,它调用Fortran例程的特殊函数),某些例程会更有效吗?我猜测有一个微妙的平衡(根据品味/风格,但也),但与R或Matlab相比,对性能的影响要小得多.
这是一个好问题。对此我只能提供我个人的看法。
我在 Julia 中编写代码的方式包括两个步骤:
编写函数的紧凑矢量化(或矩阵)版本:
在我有了一个有效的(并经过测试的)实现之后,我有时会对其进行去向量化:
再说一次,这只是我目前的看法,也许我将来会改变主意?目前这对我来说效果很好,因为我正处于项目的原型阶段。
更进一步,我们常说 Julia 解决了所谓的两种语言问题。您可以从天真的开始构建非常复杂的 API。后来,如果你在设计方面没有严重失败,总有办法让事情顺利进行。