gpt4 book ai didi

types - Julia:抽象和具体类型整数与 Int8 与 Int64

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

假设我有一个整数 n只会在 [0, 10] 中取值.我应该将其声明为 n::Integer笼统地说,如 n::Int8n::UInt8要节俭或n::Int64对于 64 位系统?
请说明新手的原因,例如风格, 性能.
引用:https://docs.julialang.org/en/release-0.5/manual/integers-and-floating-point-numbers/
更新引用 (2021): https://docs.julialang.org/en/v1/manual/types/#man-abstract-types

最佳答案

区分两种不同的情况很重要。

存储:如果你有一个存储 n 的类型作为其字段之一,或作为数组中的值,那么您绝对应该考虑使用 Int8UInt8 .即使单个值节省的空间可以忽略不计,如果您的类型的许多实例被创建并存储在一个集合中,那么空间节省会迅速变得显着。假设您有一个 Foo输入字段 n ,那么你可以这样做:

struct Foo
n::UInt8
end

当给 n 赋值时领域 Foo对象,它会自动转换为 UInt8如果无法忠实地转换值,则会引发错误:
julia> Foo(123) # Ints are automatically converted to UInt8
Foo(0x7b)

julia> typeof(ans.n)
UInt8

julia> Foo(500) # if too large, an error is raised
ERROR: InexactError()
Stacktrace:
[1] Foo(::Int64) at ./REPL[1]:2

julia> Foo(-1) # ditto if too small
ERROR: InexactError()
Stacktrace:
[1] Foo(::Int64) at ./REPL[1]:2

julia> Foo(2π/π)
Foo(0x02)

如果分配的值已经是正确的类型,则不需要检查,因此没有开销。

调度:如果您正在编写一个接受 n 的函数的方法作为一个论点,那么在 n 上放一个松散的类型注释是没有坏处的。论证在语义上是有意义的。在您描述的情况下,似乎任何类型的整数值都是合理的,因此使用 n::Integer可能是合适的。例如,如果想为 Foo 实现一个检查构造函数对象,你可以这样做:
struct Foo
n::UInt8

function Foo(n::Integer)
0 <= n <= 10 || throw(ArgumentError("n not in [0, 10]: $n"))
return new(n)
end
end

现在,如果给出了 [0, 10] 之外的值,则会引发错误:
julia> Foo(123)
ERROR: ArgumentError: n not in [0, 10]: 123
Stacktrace:
[1] Foo(::Int64) at ./REPL[26]:2

julia> Foo(3)
Foo(0x03)

Foo构造适用于任何类型的整数,检查它是否在正确的范围内,然后转换为 UInt8 .这比 Foo 的内置构造函数的限制要稍微多一些。 ,它会很乐意接受任何类型的 n参数并尝试将其转换为 UInt8 – 即使参数不是整数类型。如果这种行为是可取的,您可以将此处的类型签名进一步放宽到 n::Real , n::Number (甚至 n::Any ,尽管这似乎有些过分)。

请注意,紧密类型的方法参数没有性能优势——实际参数类型的专用代码无论如何都是按需生成的。

关于types - Julia:抽象和具体类型整数与 Int8 与 Int64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44435745/

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