【发布时间】:2018-09-21 21:35:30
【问题描述】:
我从多年的 R 和 Matlab 来到 julia,其中矢量化代码是性能的关键,并影响了我的思维。现在,阅读 S. Johnson 的这篇 wonderful blog post 'more dots',我确信 julia 的句法循环融合是该语言的一个很棒的特性,但是在移植我之前的向量化代码时它让我有点困惑。
将一些函数向量化到几个参数上是不是很糟糕/糟糕的形式? - 我应该改为编写所有例程的“标量”版本并调用点版本(或广播/map) 当我想遍历一个数组时?
为了论证起见,假设我写了以下内容
function sphere_vol(r)
return 4/3*pi*r^3
end
然后在另一个函数中使用它,
function density(N, r)
V = sphere_vol(r)
return N/V
end
等等(许多函数相互调用)。我的直觉(来自其他语言)是将大多数函数定义为矢量化只要方便,如sphere_vol(r) = 4/3*pi*r.^3(微不足道的变化)。如果我可以自动调用sphere_vol.(r::Array)(或map(sphere_vol, r::Array)),这样做有什么意义吗?对于单参数函数,这不是一个重要的决定,但对于多个参数,它可以显着改变实现:我可以定义density(N, r) 的矢量化版本,通过r 或N 或两者(返回矩阵)进行矢量化,但以这种方式编写并不那么简单(需要通过sphere_vol.() 和@987654331 在内部调用广播@)。在 R 和 Matlab 中,我根据具体情况做出了这个选择,并考虑到了这种折衷:
矢量化(过去)更方便、更高效:我可以调用一次
density(N::Vector, r::Vector)并获得完整的值数组。编写在多个参数上的矢量化函数很快就会变得繁琐和/或难以管理(通过一些技巧通常可以使用 2 个参数);特别是当返回值不是标量时。
在julia中实现一个新功能的时候不知道怎么做判断调用。
如果说在 julia 中我最好像上面那样编写 only“标量”版本,是否正确?或者,如果对某些参数进行向量化(例如调用 Fortran 例程的特殊函数,如 Bessel),某些例程是否会更有效? 我猜想找到一个微妙的平衡点(也根据口味/风格),但对性能的影响比 R 或 Matlab 小得多。
【问题讨论】:
标签: julia vectorization broadcasting