如何在 Julia 中通过索引有效访问函数?

问题描述 投票:0回答:1

我有一组函数想要对某些数据使用。目前,我将这些函数存储在全局数组中以便能够对它们进行索引。

const global _rot01(x)::Tuple{Int64, Int64, Int64} = ( x[1],  x[2],  x[3])
const global _rot02(x)::Tuple{Int64, Int64, Int64} = ( x[2],  x[3],  x[1])
...
const global _rot24(x)::Tuple{Int64, Int64, Int64} = (-x[1], -x[3], -x[2])

const global Rotations = [
    _rot01,
    ...
    _rot24
]

但是,我希望优化这一点,因为我听说应该避免全局值。 switch 语句可以让我有效地选择正确的函数,但这些不可用。这个函数向量是做到这一点的唯一方法吗?这有多有效?另外,我应该用“真实”函数定义替换这些函数吗?

function optimization julia global
1个回答
0
投票

首先,你不需要写:

const global _rot01(x)::Tuple{Int64, Int64, Int64} = ( x[1],  x[2],  x[3])

定义这样的函数就足够了:

_rot01(x)::Tuple{Int64, Int64, Int64} = ( x[1],  x[2],  x[3])

函数默认是const。你写的是真正的函数定义。另外你不需要写

::Tuple{Int64, Int64, Int64}
(除非你知道你需要强制转换数据),只需要写:

就足够了
_rot01(x) = ( x[1],  x[2],  x[3])

除非

x
是一些奇怪的数据结构(例如
Any
的向量),否则 Julia 会自动检测函数的返回类型。

第二名:

const global Rotations = [
    _rot01,
    ...
    _rot24
]

你不需要写

global
(我知道你正在全局范围内定义
Rotations
)。

相反,我认为写得不错的是:

const global Rotations = (; _rot01, ... _rot24)

这将您定义为

Rotations
作为命名元组,然后您可以通过以下方式访问它:

Rotations[1]

Rotations._rot01

得到第一个函数,效率会很高。

如果你不喜欢它,那么做一个元组:

const global Rotations = (_rot01, ... _rot24)

也可以(但是您只能通过索引进行访问,而不能通过名称进行访问)。

现在为什么定义:

const Rotations = [
    _rot01,
    ...
    _rot24
]

不好。原因是,该向量的元素类型将是

Function
,这意味着您的代码将不稳定,因为
Function
是抽象类型(与专门化其字段类型的
Tuple
NamedTuple
相反) )。并且输入无法的代码会导致性能下降。

最后,

如果您想从全局范围访问它,只需将

Rotations
定义为
const
即可。但如果你想将它传递给函数,只需将其定义为普通变量并作为函数参数传递就完全可以,事情会很快。

我知道我的回答触动了很多东西。如果有什么需要进一步澄清,请评论。

© www.soinside.com 2019 - 2024. All rights reserved.