gpt4 book ai didi

memory - 最小化 Julia 函数中的内存使用

转载 作者:行者123 更新时间:2023-12-04 01:09:30 31 4
gpt4 key购买 nike

这个函数是我想要优化的主力。任何关于如何限制其内存使用的想法都会很棒。

function F(len, rNo, n, ratio = 0.5)
s = zeros(len); m = copy(s); d = copy(s);
s[rNo]=1

rNo ≤ len-1 && (m[rNo + 1] = s[rNo+1] = -n[rNo])
rNo > 1 && (m[rNo - 1] = s[rowNo-1] = n[rowNo-1])

r=1
while true
for i ∈ 2:len-1
d[i] = (n[i]*m[i+1] - n[i-1]*m[i-1])/(r+1)
end

d[1] = n[1]*m[2]/(r+1);
d[len] = -n[len-1]*m[len-1]/(r+1);

for i ∈ 1:len
s[i]+=d[i]
end

sum(abs.(d))/sum(abs.(m)) < ratio && break #converged

m = copy(d); r+=1
end

return reshape(s, 1, :)
end

它计算我稍后堆叠的特殊矩阵指数的行。

尽管由于特殊属性,完整方法比 exp 中内置的方法快得多,但根据 @time 测量,它占用的内存要多得多。

由于我是内存管理和 Julia 方面的菜鸟,我相信它可以优化很多..

我做错了什么吗?

最佳答案

我认为您的大部分分配来自 sum(abs.(d))/sum(abs.(m)) < ratio && break #converged .如果将其替换为 sum(abs, d)/sum(abs,m) < ratio && break #converged这些分配应该消失。 (这也会提高速度)。

可以通过替换 m = copy(d) 来删除您的其他分配与 m .= d它执行按元素复制。

还有一些风格的东西,我认为你可以使这个函数更容易阅读和使用。我的更改如下

function F(rNo, v, ratio = 0.5)
len = length(v)
s = zeros(len+1); m = copy(s); d = copy(s);
s[rNo]=1

rNo ≤ len && (m[rNo + 1] = s[rNo+1] = -v[rNo])
rNo > 1 && (m[rNo - 1] = s[rowNo-1] = v[rowNo-1])

r=1
while true
for i ∈ 2:len
d[i] = (v[i]*m[i+1] - v[i-1]*m[i-1]) / (r+1)
end

d[1] = v[1]*m[2]/(r+1);
d[end] = -v[end]*m[end]/(r+1);

s .+= d

sum(abs, d)/sum(abs, m) < ratio && break #converged

m .= d; r+=1
end

return reshape(s, 1, :)
end

最显着的变化是删除了 len从论点。包含数组长度参数在 C 语言(可能还有其他语言)中很常见,因为在 C 语言中很难找到数组的长度,但在 Julia 中 length很便宜(O(1)),添加额外的参数只会让使用它的人更加困惑和困惑。我还利用了 julia 能够转 s[end] 的事实。进入s[length(x)]使它更干净一点。此外,通常在使用 Julia 时,您应该寻找使用点操作的方法,而不是编写 for 循环。 for 循环会很快,但是为什么要用 3 行来完成你在 1 条较短的行中可以做的事情呢? (我还将 n 重命名为 v,因为对我来说 n 是一个数字,v 是一个向量,但这纯粹是偏好)。

希望对您有所帮助。

关于memory - 最小化 Julia 函数中的内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65314372/

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