gpt4 book ai didi

Julia 短路

转载 作者:行者123 更新时间:2023-12-05 03:22:38 26 4
gpt4 key购买 nike

考虑

function foo(x)
x isa Bar || throw(ArgumentError("x is not a Int64..."))

dosomething(x)
end

相对于传统

function foo(x)
if !(x isa Bar)
throw(ArgumentError("x is not a Bar..."))
end

dosomething(x)
end

(功能上等同于 !(x isa Int64) && ...)翻阅了一些包,似乎这种条件评估并不流行——从表面上看,它似乎很方便,我更喜欢它的风格。

在风格上是否有共识?我知道,为了可读性/兼容性,至少 Blue 风格指南不鼓励使用 Unicode\in 而不是“in”这个词——这是类似的东西吗?

这会降低性能吗?从表面上看,它似乎需要大约相同数量的操作。我遇到了this post也一样,但答案不是很令人满意,甚至忽略它现在可能已经过时。

最佳答案

当问自己这样的性能问题时,通常最好通过 @code_lowered@code_typed@code_llvm 查看编译后的代码, @code_native。这些宏中的每一个都进一步解释了编译过程中的一个步骤。

考虑

function x5a(x)
x < 5 && (x=5)
x
end

function x5b(x)
if x < 5
x=5
end
x
end

让我们试试@code_lowered

julia> @code_lowered x5a(3)
CodeInfo(
1 ─ x@_3 = x@_2
│ %2 = x@_3 < 5
└── goto #3 if not %2
2 ─ x@_3 = 5
└── goto #3
3 ┄ return x@_3
)

julia> @code_lowered x5b(3)
CodeInfo(
1 ─ x@_3 = x@_2
│ %2 = x@_3 < 5
└── goto #3 if not %2
2 ─ x@_3 = 5
3 ┄ return x@_3
)

几乎相同 - 它会在编译过程中进一步简化吗?让我们看看!

julia> @code_typed x5a(3)
CodeInfo(
1 ─ %1 = Base.slt_int(x@_2, 5)::Bool
└── goto #3 if not %1
2 ─ nothing::Nothing
3 ┄ %4 = φ (#2 => 5, #1 => x@_2)::Int64
└── return %4
) => Int64

julia> @code_typed x5b(3)
CodeInfo(
1 ─ %1 = Base.slt_int(x@_2, 5)::Bool
└── goto #3 if not %1
2 ─ nothing::Nothing
3 ┄ %4 = φ (#2 => 5, #1 => x@_2)::Int64
└── return %4
) => Int64

这两个函数具有相同的低位代码,这意味着它们将产生相同的汇编代码,因此执行相同的 CPU 指令集。

关于样式 - 官方样式指南中没有记录,因此代码可读性是标准,就像 Bogumil 所说的那样,这种样式非常流行。

关于 Julia 短路,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72669133/

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