julia - Julia:如何查看去向量化的代码?
解决方案
我认为您要求的内容不存在(如果我错了,请证明我错了!)。
您能做的最好的事情是使用@code_lowered, @code_typed, @code_llvm, @code_native
宏(特别是@code_lowered
)来查看您的 Julia 代码片段会发生什么。但是,由于 Julia并未在内部将所有点转换为显式 for 循环,因此这些片段都不会向您显示代码的 for 循环版本。
例子:
julia> a,b = rand(3), rand(3);
julia> f(a,b) = a.*b
f (generic function with 1 method)
julia> @code_lowered f(a,b)
CodeInfo(
1 1 ─ %1 = Base.Broadcast.materialize │
│ %2 = Base.Broadcast.broadcasted │
│ %3 = (%2)(Main.:*, a, b) │
│ %4 = (%1)(%3) │
└── return %4 │
)
因此,Julia 将其.*
转换为Base.Broadcast.broadcasted
调用。当然,我们可以更进一步,做
julia> @which Base.Broadcast.broadcasted(Main.:*, a, b)
broadcasted(f, arg1, arg2, args...) in Base.Broadcast at broadcast.jl:1139
并检查broadcast.jl
第 1139 行等以跟踪broadcasted
将被调用的实际方法(也许 Tim Holy 的Rebugger在这里很有用:D)。但正如我之前所说,其中不会有 for 循环。相反,您会发现如下内容:
broadcasted(::DefaultArrayStyle{1}, ::typeof(*), r::AbstractRange, x::Number) = range(first(r)*x, step=step(r)*x, length=length(r))
broadcasted(::DefaultArrayStyle{1}, ::typeof(*), r::StepRangeLen{T}, x::Number) where {T} =
StepRangeLen{typeof(T(r.ref)*x)}(r.ref*x, r.step*x, length(r), r.offset)
broadcasted(::DefaultArrayStyle{1}, ::typeof(*), r::LinRange, x::Number) = LinRange(r.start * x, r.stop * x, r.len)
更新
copyto!
好的,最终,我在in 中找到了 for 循环broadcast.jl
。但这可能是深入兔子洞。
推荐阅读
- r - 根据来自第二个数据帧的信息,一个数据帧的子集列(按名称)
- html - Bootstrap 4 - Html/CSS:行列内的贴纸页脚
- wagtail - 有没有办法在 Wagtail modeladmin 中添加实时链接到基于页面的列表视图?
- android - 使用 Realm 和 Parcel 将 API 响应存储在两个不同的模型对象中
- html - 网格布局未显示
- r - 在 R 中按特定顺序排序数据
- c++ - 序列化人脸特征以在 DLIB 中进行识别
- django - Django:无法解析 /accounts/password_reset/ 上的关键字“is_active”
- javascript - 在渲染方法 [REACT NATIVE] 中访问此变量
- mysql - SQL查询统计图片并获取封面图片