gpt4 book ai didi

Julia 中瓶颈操作的优化

转载 作者:行者123 更新时间:2023-12-03 07:53:44 25 4
gpt4 key购买 nike

我有一个程序,需要执行许多简单的计算(它实际上是蒙特卡罗的变体)。经过基准测试后,我注意到以下函数是我的瓶颈所在。

function get_window_of_Aₖ(model, target , K, n_samples)
count.([model.(rand(Normal(μ, stddev), K)') .< target(rand(Normal(μ, stddev))) for _ in 1:n_samples])
end

在几行中分析并重写这个函数后,

function get_window_of_Aₖ(model, target, K, n_samples)
counts = Vector{Int}(undef, n_samples)
for i in 1:n_samples
model_samples = rand(Normal(μ, stddev), K)
target_sample = rand(Normal(μ, stddev))
@inbounds counts[i] = count(model.(model_samples) .< target(target_sample))
end
return counts
end

真正的成本可以在 count(model.(model_samples) .< target(target_sample)). 行中找到。

我尝试过使用sum而不是count ,减去并检查符号,使用 SVectors , map ,但到目前为止我还没有取得满意的优化。有人能想到我没有见过的简单优化吗?另外,我没有使用多线程或多处理,因为我打算在例程的最外层循环中执行此操作,此处未显示。

另一方面,您可以考虑函数 model(x) = 3x + 10target(x) = 10x + 3 ,例如。

最佳答案

通过避免分配,我的速度提高了 4 倍。我的设置

model_samples = rand(Normal(0, 1), 10_000)
target_sample = rand(Normal(0, 1))

实际测试:

julia> @btime count(model.($model_samples) .< target($target_sample))
6.800 μs (3 allocations: 5.55 KiB)
1248

julia> @btime sum( model(x) < target($target_sample) for x in $model_samples )
1.870 μs (0 allocations: 0 bytes)
1248

关于Julia 中瓶颈操作的优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76533767/

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