如何解决Julia 中使用的函数参数中的美元符号前缀是什么?
当我在 Julia 中搜索“$”前缀时,我只能找到它用于字符串或表达式插值。例如,这里https://docs.julialang.org/en/v1/base/punctuation/。但是,我见过像
这样的人的代码add_broadcast!($y_d,$x_d)
在本教程中https://cuda.juliagpu.org/stable/tutorials/introduction/。这里的“$”符号不能插值,可以吗?在函数文档 https://docs.julialang.org/en/v1/manual/functions/ 中没有关于这种用法的任何内容。所以我很困惑。任何想法表示赞赏。谢谢!
解决方法
像您展示的 $
符号表达式是非标准的 Julia 代码,它通常只出现在传递给宏的表达式中。在您的示例中正是这种情况,其中整行是:
@btime add_broadcast!($y_d,$x_d)
使用来自 BenchmarkTools.jl 的 @btime
宏。如果您转到 Quick Start 部分,您可以阅读:
如果您要基准测试的表达式依赖于外部变量,您应该使用 $ 将它们“插入”到基准表达式中,以避免使用全局变量进行基准测试的问题。本质上,任何内插变量 $x 或表达式 $(...) 都是在基准测试开始之前“预先计算”的:
简而言之,对于 @btime
,您可以使用 $
将它们“插入”到基准表达式中,以获得正确的基准结果。
$
符号与宏一起用于在其他包中进行插值,例如DataFrameMacros.jl。
编辑:
引用非常量全局变量时不使用 $
如何影响执行时间的示例:
julia> using BenchmarkTools
julia> x = 1
1
julia> @btime (y = 0; for _ in 1:10^6 y += x end; y) # slow and a lot of allocations
22.102 ms (999489 allocations: 15.25 MiB)
1000000
julia> @btime (y = 0; for _ in 1:10^6 y += $x end; y) # loop is optimized out
5.600 ns (0 allocations: 0 bytes)
1000000
julia> const z = 1
1
julia> @btime (y = 0; for _ in 1:10^6 y += z end; y) # loop is optimized out
5.000 ns (0 allocations: 0 bytes)
你可以这样想。在上面的示例中,不使用 $
就像您创建并运行了以下函数:
function temp1()
y = 0
for _ in 1:10^6
y += x
end
y
end
你会得到:
julia> @btime temp1()
22.106 ms (999489 allocations: 15.25 MiB)
1000000
虽然使用 $
就像在函数体内定义了 x
一样:
function temp2()
x = 1
y = 0
for _ in 1:10^6
y += x
end
y
end
现在你有:
julia> @btime temp2()
5.000 ns (0 allocations: 0 bytes)
1000000
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。