gpt4 book ai didi

julia - 取决于全局定义位置,执行时间要长几个数量级?

转载 作者:行者123 更新时间:2023-12-05 00:51:12 25 4
gpt4 key购买 nike

我写完了下面的程序,在调试阶段之后开始做一些清理工作:

using BenchmarkTools

function main()
global solution = 0
global a = big"1"
global b = big"1"
global c = big"0"
global total = 0

while a < 100
while b < 100
c = a^b
s = string(c)
total = 0
for i in 1:length(s)
total = total + Int(s[i]) - 48
end
if total > solution
global solution = total
end
global b = b + 1
end
global b = 1
global a = a + 1
end
end

@elapsed begin
main()
end

#run @elapsed twice to ignore compilation overhead
t = @elapsed main()
print("Solution: ", solution)
t = t * 1000;
print("\n\nProgram completed in ", round.(t; sigdigits=5), " milliseconds.")

我的机器的运行时间约为 150 毫秒。

我决定重新排列全局变量以更好地匹配程序的典型布局,其中全局变量定义在顶部:

using BenchmarkTools

global solution = 0
global a = big"1"
global b = big"1"
global c = big"0"
global total = 0

function main()

while a < 100
while b < 100
c = a^b
s = string(c)
total = 0
for i in 1:length(s)
total = total + Int(s[i]) - 48
end
if total > solution
global solution = total
end
global b = b + 1
end
global b = 1
global a = a + 1
end
end

@elapsed begin
main()
end

#run @elapsed twice to ignore compilation overhead
t = @elapsed main()
print("Solution: ", solution)
t = t * 1000;
print("\n\nProgram completed in ", round.(t; sigdigits=5), " milliseconds.")

对定义全局变量的位置进行一次更改将我机器上的运行时间减少到 0.0042 毫秒。

为什么运行时间如此显着减少?

最佳答案

不要使用全局变量。

不要。利用。全局人。他们很糟糕。

当您在 main 函数之外定义全局变量时,第二次运行函数时,a 已经等于 100,并且 main() 在做任何事情之前退出。

全局变量是个坏主意,不仅在 Julia 中,在一般编程中也是如此。您可以在定义适当的常量时使用它们,例如 π,也许还有其他一些特殊情况,但不能用于这样的事情。

让我在没有全局变量的情况下重写你的函数:

function main_locals()
solution = 0
a = 1
while a < 100
b = 1
c = big(1)
while b < 100
c *= a
s = string(c)
total = sum(Int, s) - 48 * length(s)
solution = max(solution, total)
b += 1
end
a += 1
end
return solution
end

在我的笔记本电脑上,这比在函数内部定义全局变量的版本快 20 倍,即实际工作的版本。另一个不能正常工作,因此比较不相关。

编辑:我什至把它复杂化了。您唯一需要做的就是从您的第一个函数中删除所有 global 并返回解决方案,然后它将正常工作,并且几乎与我编写的代码一样快:

function main_with_globals_removed()
solution = 0
a = big"1"
b = big"1"
c = big"0"
total = 0

while a < 100
while b < 100
c = a^b
s = string(c)
total = 0
for i in 1:length(s)
total = total + Int(s[i]) - 48
end
if total > solution
solution = total
end
b = b + 1
end
b = 1
a = a + 1
end
return solution # remember return!
end

不要使用全局变量。

关于julia - 取决于全局定义位置,执行时间要长几个数量级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72651825/

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