gpt4 book ai didi

types - 为什么要在Julia中创建抽象父类(super class)型?

转载 作者:行者123 更新时间:2023-12-03 13:44:54 30 4
gpt4 key购买 nike

我正在查看某人的代码,并且在创建结构时使用了<:。我查看了docs,发现这意味着他们正在创建抽象父类(super class)型。谁能解释这是什么以及为什么要使用它?

最佳答案

什么是抽象类型?

抽象类型是类型层次结构中的节点:它们将类型分组在一起。这使您可以编写适用于整个类型组的方法:

julia> abstract type AbstractFoo end

julia> struct Foo1 <: AbstractFoo end

julia> struct Foo2 <: AbstractFoo end

julia> foo_op(x::AbstractFoo) = "yay!"
foo_op (generic function with 1 method)

julia> foo_op(Foo1())
"yay!"

julia> foo_op(Foo2())
"yay!"

为什么抽象类型有用?

抽象类型使您可以将行为与实现分开。这对于性能至关重要。当您声明抽象父类(super class)型 时,您会自动继承该父类(super class)型的核心行为,但可以自由地实现该行为的更有效实现。

一个常见的示例是 AbstractArray抽象类型。它表示访问元素的某些多维集合的单个元素的能力。给定一些问题,我们通常可以选择一个抽象数组的子类型来产生有效的操作: 子类型上的附加约束构成了程序员可以利用的信息,以使某些操作更有效

例如,假设我们要查找1..N的总和。我们可以使用整数数组,但是与 UnitRange相比,这将是非常低效的。 UnitRange的选择可编码有关数据特征的信息。我们可以利用以提高效率的信息。 (有关此示例的更多信息,请参见 this answer)。
julia> using BenchmarkTools

julia> @btime sum($(1:1000_000))
0.012 ns (0 allocations: 0 bytes)
500000500000

julia> @btime sum($(collect(1:1000_000)))
229.979 μs (0 allocations: 0 bytes)
500000500000
BitArray为 bool 数组提供空间有效的表示, SparseArrays为稀疏数据提供有效的操作,依此类推。如果您拥有一些通常表现得像抽象数组但具有独特特征的数据,则可以定义自己的子类型。

这种模式可以推广到其他抽象类型。使用它们可以对某些共享行为的不同实现进行分组。

关于types - 为什么要在Julia中创建抽象父类(super class)型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60218078/

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