Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Julia中使用`\`而不是`/`_Julia - Fatal编程技术网

在Julia中使用`\`而不是`/`

在Julia中使用`\`而不是`/`,julia,Julia,对于标量,\(求解线性系统)运算符等价于除法运算符/。性能相似吗 我这样问是因为目前我的代码有一行 x = (1 / alpha) * averylongfunctionname(input1, input2, input3) 从视觉上看,alpha的除法发生在“左侧”是很重要的,因此我正在考虑用 x = alpha \ averylongfunctionname(input1, input2, input3) 从风格和性能的角度来看,这种情况下的最佳做法是什么? 以下是一些令人困惑的基准测

对于标量,
\
(求解线性系统)运算符等价于除法运算符
/
。性能相似吗

我这样问是因为目前我的代码有一行

x = (1 / alpha) * averylongfunctionname(input1, input2, input3)
从视觉上看,
alpha
的除法发生在“左侧”是很重要的,因此我正在考虑用

x = alpha \ averylongfunctionname(input1, input2, input3)
从风格和性能的角度来看,这种情况下的最佳做法是什么?

以下是一些令人困惑的基准测试结果:

julia> using BenchmarkTools
[ Info: Precompiling BenchmarkTools [6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf]

julia> @btime x[1]\sum(x) setup=(x=rand(100))
  15.014 ns (0 allocations: 0 bytes)
56.23358979466163

julia> @btime (1/x[1]) * sum(x) setup=(x=rand(100))
  13.312 ns (0 allocations: 0 bytes)
257.4552413802698

julia> @btime sum(x)/x[1] setup=(x=rand(100))
  14.929 ns (0 allocations: 0 bytes)
46.25209548841374
它们都差不多,但是我很惊讶
(1/x)*foo方法有最好的性能

我不知道,但我可以建议您尝试使用基准测试工具 软件包:它可以帮助您评估这两种软件的性能 不同的说法。你可以找到更多的细节。再见

我认为最好的选择是
(1/x)*foo
,原因有二:

  • 它有最好的性能(尽管与其他的相比不是很多)
  • 对于阅读代码的另一个人来说,这更清楚

  • 标量
    /
    \
    实际上应该具有相同的含义和性能。让我们定义这两个测试函数:

    f(a, b) = a / b
    g(a, b) = b \ a
    
    然后,我们可以看到它们生成相同的LLVM代码:

    julia> @code_llvm f(1.5, 2.5)
    ;  @ REPL[29]:1 within `f'
    define double @julia_f_380(double %0, double %1) {
    top:
    ; ┌ @ float.jl:335 within `/'
       %2 = fdiv double %0, %1
    ; └
      ret double %2
    }
    
    julia> @code_llvm g(1.5, 2.5)
    ;  @ REPL[30]:1 within `g'
    define double @julia_g_382(double %0, double %1) {
    top:
    ; ┌ @ operators.jl:579 within `\'
    ; │┌ @ float.jl:335 within `/'
        %2 = fdiv double %0, %1
    ; └└
      ret double %2
    }
    
    还有同样的机器代码。我不确定是什么导致了
    @btime
    结果的差异,但我非常确定
    /
    \
    之间的差异是一种幻觉,而不是真实的

    至于
    x*(1/y)
    ,其计算结果与
    x/y
    不同:由于在计算
    1/y
    时进行了舍入,然后舍入值乘以
    x
    ,这也会进行舍入,因此可能会降低精度。例如:

    julia> 17/0.7
    24.28571428571429
    
    julia> 17*(1/0.7)
    24.285714285714285
    

    由于浮点除法可以保证正确的四舍五入,所以直接除法总是更精确。但是,如果许多循环迭代都使用除数,则可以通过这样重写计算来获得加速,因为浮点乘法通常比除法快(尽管我当前的计算机没有显示这种情况)。但是,请注意,这会导致精度损失,如果除数不共享,则仍然会导致精度损失,并且不会带来性能提升。

    谢谢。关于风格的问题,你有什么想法吗?我有点喜欢使用
    alpha\(更长的表达)
    ,但有些人可能会觉得它令人困惑,所以它似乎有点主观。我会说,如果你喜欢它并发现它更清晰,就使用它。