gpt4 book ai didi

python - 使用许多没有成员函数的子案例编写干净的 Julia 代码

转载 作者:行者123 更新时间:2023-12-04 12:31:10 25 4
gpt4 key购买 nike

我正在尝试使用 Julia 语言(具有 Python 背景),并且对以最自然的方式解决我本可以使用 Python 中的对象解决的问题感兴趣。

基本上,我正在尝试编写一个函数来计算一些简单的一维数学基础,然后将它们组合起来以逼近多维函数。在 Python 中我会写类似的东西

basis_1d_values = scheme_1d.evaluate(points)

对于我的每个 scheme_1d 对象。我会使用父 Scheme1d 类,然后为各种类型的一维方案(线性、切比雪夫多项式等)创建子类,这些子类知道如何运行它们单独的“评估”函数。

在 Julia 中最自然的方法是什么?显然是一个很长的 if 语句,比如

if scheme_1d_type == "linear"
basis_1d_values = evaluate_linear(scheme_1d, points)
elif scheme_1d_type == "chebyshev"
basis_1d_values = evaluate_chebyshev(scheme_1d, points)
elif ...
...
end

会工作,但它非常笨重,因为每次子类的行为不同时我都需要使用这些分支 if 语句和单独的函数(并且当我以某种方式更新代码时必须跟踪每个 if 语句)。任何建议将不胜感激。

谢谢!

最佳答案

您谈论的是多重分派(dispatch)和子类型化,它们对于 Julia 来说是非常基础和独特的,并且会在任何介绍教程中介绍。我不打算解释这一切,因为他们做得更好,但由于您专门来自 Python,我可以指出基本的类比。

Python 只能在 1 个对象上分派(dispatch)(选择一个方法),因此您可以使它成为拥有自己版本的 evaluate 的自己的类型(类),甚至可以在函数调用期间将其写在点之前, 只是为了指出它有多么特别。

class Scheme1D:
pass

class Linear(Scheme1D):
def evaluate(self, points):
return "linear"

class Chebyshev(Scheme1D):
def evaluate(self, points):
return "chebyshev"

points = None
scheme_1d = Linear()

scheme_1d.evaluate(points)
# Python checks for type(scheme_1d) to find the correct evaluate
# and runs its bytecode (which was compiled upon class definition)

Julia 在 scheme_1dpoints 上进行分派(dispatch)(因此是多重分派(dispatch)),因此 evaluate 不属于任何类型。相反,它是具有多个方法的 1 个函数,每个方法以其组合的输入类型区分。

abstract type Scheme1D end

struct Linear <: Scheme1D
end

struct Chebyshev <: Scheme1D
end

# first method definition also creates the function
function evaluate(x::Linear, points)
return "linear"
end

# adds a method to the function
function evaluate(x::Chebyshev, points)
return "chebyshev"
end

points = nothing
scheme_1d = Linear()

evaluate(scheme_1d, points)
# Julia checks the types of scheme_1d and points, finds the
# most fitting method, compiles the method for those types
# if it is the first call, and runs the method

这应该可以帮助您适应 Julia,但您真的应该查阅教程以了解更详细的信息。在您学习时,请牢记一些对您有帮助的事情:

  1. 另一个很大的不同是,在 Julia 中,父类(super class)型是抽象的,你不能从它们中创建一个实例。您可以从中创建实例的类型称为“具体”。
  2. Julia 对特定具体输入类型的编译称为特化。这与方法分派(dispatch)不同,而是发生在它之后。这意味着您可以编写一个带有抽象参数的方法(在上面的示例中,points 从未指定类型,因此它被隐式地赋予了通用抽象类型 Any),并且Julia 将为每种合适的具体类型进行多项特化。
  3. Specializations 似乎是一个看不见的实现细节,但我认为它有助于理解 Julia 的编译是如何工作的,所以我会告诉你 MethodAnalysis< 的 methodinstances 函数 包是当前查看这些内容的首选方式。

关于python - 使用许多没有成员函数的子案例编写干净的 Julia 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69004831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com