Julia 朱莉娅:接收Dict作为输入和输出的函数是稳定的吗?

Julia 朱莉娅:接收Dict作为输入和输出的函数是稳定的吗?,julia,Julia,我试图将一些Matlab代码移植到Julia,看看优化后的Julia代码是否比优化后的Matlab代码运行得更快。Matlab代码是一个单一函数,用于描述具有多个组件的模型。在Matlab中,函数接收包含模型的许多参数和配置的结构作为输入,并输出存储所有组件行为的结构 我对Julia很陌生,但我知道Julia函数需要类型稳定才能快速。我的问题是,如果我写一个Julia函数,它接收一个Dict(类似于Matlab的结构)作为输入,然后输出一个Dict,那么函数的类型是否仍然稳定 在Matlab代码

我试图将一些Matlab代码移植到Julia,看看优化后的Julia代码是否比优化后的Matlab代码运行得更快。Matlab代码是一个单一函数,用于描述具有多个组件的模型。在Matlab中,函数接收包含模型的许多参数和配置的结构作为输入,并输出存储所有组件行为的结构

我对Julia很陌生,但我知道Julia函数需要类型稳定才能快速。我的问题是,如果我写一个Julia函数,它接收一个Dict(类似于Matlab的结构)作为输入,然后输出一个Dict,那么函数的类型是否仍然稳定


在Matlab代码中,结构包含不同类型的变量,包括矩阵、字符数组和函数句柄

Dict{String,Any}在技术上应该比全类型结构慢,因为它的值将被Julia“装箱”。但是,您的函数将花费大部分时间进行计算,并且只在运行结束时将结果放入已装箱的Dict值中

为确保功能内部稳定,可能需要输入Dict的类型提示,例如:

function f(d::Dict)
    width::Float64 = d["width"]  # now we work with width, not d["width"]

只要函数本身的这些内部保持类型稳定,使用这样的Dict,甚至Dict{Any,Any},仅仅输入和输出几个值,就不应该影响总计时,足以阻止Julia函数比另一个(MATLAB)实现运行得更快,只要它确实是一个更快的函数,否则。

一个Dict{String,Any}应该,因为它的值将被Julia“装箱”,在技术上比一个全类型结构要慢。但是,您的函数将花费大部分时间进行计算,并且只在运行结束时将结果放入已装箱的Dict值中

为确保功能内部稳定,可能需要输入Dict的类型提示,例如:

function f(d::Dict)
    width::Float64 = d["width"]  # now we work with width, not d["width"]

只要函数本身的这些内部保持类型稳定,使用这样的Dict,甚至Dict{Any,Any},仅仅输入和输出几个值,就不应该影响总计时,足以阻止Julia函数比另一个(MATLAB)实现运行得更快,只要它确实是一个更快的函数,否则。

为什么不把它变成一个结构呢?还是一个元组?或者一个命名的tuple?为了扩展@ChrisRackauckas的评论,Julia确实有结构(也称为复合类型),这可能是您应该在这里使用的。请参阅。谢谢您的评论。我确实需要阅读更多关于Julia docs的内容。@CameronBieganek有可能制作一个相同复合类型的数组吗?是的,这很常见。您可以显式地将它们设置为
[MyInt(1),MyInt(2)]
,也可以使用点语法进行广播,例如
MyInt.([1,2])
。这个包也很方便。为什么不把它做成一个结构呢?还是一个元组?或者一个命名的tuple?为了扩展@ChrisRackauckas的评论,Julia确实有结构(也称为复合类型),这可能是您应该在这里使用的。请参阅。谢谢您的评论。我确实需要阅读更多关于Julia docs的内容。@CameronBieganek有可能制作一个相同复合类型的数组吗?是的,这很常见。您可以显式地将它们设置为
[MyInt(1),MyInt(2)]
,也可以使用点语法进行广播,例如
MyInt.([1,2])
。这个包可能也很方便。因此,如果函数将被多次调用(在我的情况下,我需要执行遗传算法来优化参数),并且输入和输出Dict(或struct,如一些注释所示)包含不同类型的变量,它会影响性能吗?对于具有多个调用(例如来自内部循环)的短函数,最好传递一个全类型结构。Julia通过引用传递这些数据(特别是当它们是可变结构时),因此没有复制或散列开销。对于很少调用的大型函数,使用的调用参数类型不应影响性能,特别是如果函数中耗时的计算是使用更容易保持类型稳定的局部变量完成的。因此,如果函数将被多次调用(在我的例子中,我需要执行一个遗传算法来优化参数),以及输入和输出Dict(或struct,如一些评论所示)包含不同类型的变量,它会影响性能吗?对于具有多个调用(例如来自内部循环)的短函数,最好传递完全类型的结构。Julia通过引用传递这些变量(特别是当它们是可变结构时),因此没有复制或散列开销。对于很少调用的大型函数,使用的调用参数类型不应影响性能,特别是如果函数中耗时的计算是使用更容易保持类型稳定的局部变量完成的。