Julia 使用'Int((n+;1)/2)`、'round(Int,(n+;1)/2)`或'Int((n+;1)/2)`哪个更好?

Julia 使用'Int((n+;1)/2)`、'round(Int,(n+;1)/2)`或'Int((n+;1)/2)`哪个更好?,julia,Julia,我有一个奇数n,想用(n+1)/2作为数组索引。计算指数的最佳方法是什么?我刚刚想出了使用Int((n+1)/2),round(Int,(n+1)/2))和Int((n+1)/2)。哪个更好?我不需要太担心它们吗?为了获得更好的性能,您需要整数除法(div或÷)/为整数参数提供浮点结果/给出了一个有理数而不是整数。因此,您需要编写div(n+1,2)或(n+1)÷2。要键入÷,您可以编写\div,然后按julia REPL、Jupyter笔记本、Atom等上的TAB键 即使被除数(n+1)是偶数

我有一个奇数
n
,想用
(n+1)/2
作为数组索引。计算指数的最佳方法是什么?我刚刚想出了使用
Int((n+1)/2)
round(Int,(n+1)/2))
Int((n+1)/2)
。哪个更好?我不需要太担心它们吗?

为了获得更好的性能,您需要整数除法(
div
÷
)<代码>/为整数参数提供浮点结果
/
给出了一个
有理数
而不是整数。因此,您需要编写
div(n+1,2)
(n+1)÷2
。要键入
÷
,您可以编写
\div
,然后按julia REPL、Jupyter笔记本、Atom等上的TAB键

即使被除数(n+1)是偶数,您也需要整数除法直接获得整数结果,否则您需要将结果转换为整数,这反过来会比整数除法成本更高

您也可以使用右位移位运算符
>
或无符号右位移位运算符
>>
,因为正整数除以
2^n
对应于将该整数的位向右移位n次。虽然整数除以2的幂将被编译器降低为位移位操作,但如果被除数是有符号整数(即Int而不是UInt),编译后的代码仍将有一个额外的步骤因此,使用正确的位移位运算符可能会提供更好的性能,尽管这可能是过早的优化,并且会影响代码的可读性。

带有负整数的
>
>
的结果将不同于整数除法(
div
)的结果

还请注意,使用无符号右位移位运算符
>>
可能会避免一些整数溢出问题

分区(x,y)

÷(x,y)

欧氏除法的商。计算x/y,截断为 整数

您可以使用
@code\u native
宏查看如何将内容编译为本机代码。请不要忘记更多的说明并不一定意味着速度较慢,尽管这里是这样

julia> f(a) = a ÷ 2
f (generic function with 2 methods)

julia> g(a) = a >> 1
g (generic function with 2 methods)

julia> h(a) = a >>> 1
h (generic function with 1 method)

julia> @code_native f(5)
    .text
; Function f {
; Location: REPL[61]:1
; Function div; {
; Location: REPL[61]:1
    movq    %rdi, %rax
    shrq    $63, %rax
    leaq    (%rax,%rdi), %rax
    sarq    %rax
;}
    retq
    nop
;}

julia> @code_native g(5)
    .text
; Function g {
; Location: REPL[62]:1
; Function >>; {
; Location: int.jl:448
; Function >>; {
; Location: REPL[62]:1
    sarq    %rdi
;}}
    movq    %rdi, %rax
    retq
    nopw    (%rax,%rax)
;}

julia> @code_native h(5)
    .text
; Function h {
; Location: REPL[63]:1
; Function >>>; {
; Location: int.jl:452
; Function >>>; {
; Location: REPL[63]:1
    shrq    %rdi
;}}
    movq    %rdi, %rax
    retq
    nopw    (%rax,%rax)
;}

那么
(n+1)>>1
呢?@rickhg12hs添加了位移位运算符,虽然答案变得非常长和复杂。还请注意,并非每个数组都有正索引,因此使用位移位运算符对具有负索引(例如)的数组进行索引的效果将不同于欧几里德除法。您可能希望看到我的答案的更新。
julia> f(a) = a ÷ 2
f (generic function with 2 methods)

julia> g(a) = a >> 1
g (generic function with 2 methods)

julia> h(a) = a >>> 1
h (generic function with 1 method)

julia> @code_native f(5)
    .text
; Function f {
; Location: REPL[61]:1
; Function div; {
; Location: REPL[61]:1
    movq    %rdi, %rax
    shrq    $63, %rax
    leaq    (%rax,%rdi), %rax
    sarq    %rax
;}
    retq
    nop
;}

julia> @code_native g(5)
    .text
; Function g {
; Location: REPL[62]:1
; Function >>; {
; Location: int.jl:448
; Function >>; {
; Location: REPL[62]:1
    sarq    %rdi
;}}
    movq    %rdi, %rax
    retq
    nopw    (%rax,%rax)
;}

julia> @code_native h(5)
    .text
; Function h {
; Location: REPL[63]:1
; Function >>>; {
; Location: int.jl:452
; Function >>>; {
; Location: REPL[63]:1
    shrq    %rdi
;}}
    movq    %rdi, %rax
    retq
    nopw    (%rax,%rax)
;}