For loop For循环在函数外部时在Julia中运行得非常慢

For loop For循环在函数外部时在Julia中运行得非常慢,for-loop,julia,For Loop,Julia,朱莉娅有一种特别的慢性子。例如,在运行for循环时,通过调用函数 function TestFunc(num) for i=1:num end end 它比我只为完全相同的数值运行for循环要快得多 for i=1:num end 减速也不是边际的,它的速度慢了很多,下图显示了我在运行它 在我的其他一些代码中,实际情况正好相反,但我只是觉得我缺少了Julia运行方式的一些基本信息。如何使代码保持最佳状态以及为什么存在这些差异?任何可以在函数外部编写的内容都可以在函数内部

朱莉娅有一种特别的慢性子。例如,在运行for循环时,通过调用函数

function TestFunc(num)
     for i=1:num
     end
end
它比我只为完全相同的数值运行for循环要快得多

for i=1:num
end
减速也不是边际的,它的速度慢了很多,下图显示了我在运行它


在我的其他一些代码中,实际情况正好相反,但我只是觉得我缺少了Julia运行方式的一些基本信息。如何使代码保持最佳状态以及为什么存在这些差异?

任何可以在函数外部编写的内容都可以在函数内部编写。就像C语言一样,你可以写

function main()
    print("Hello World\n")
end

main()
因此,只需假设它是一个C程序,并在main()函数中编写您的内容

为什么函数外的速度如此之慢,这是因为函数内的任何变量都受到保护,不会被其他线程或任务更改。因此,对于全局范围中的for循环,每次for循环访问它时都必须检查其变量的类型,以防它被另一个线程或任务更改。为了安全起见,所有这些检查都在放慢速度

朱莉娅的第一个表演法则是

全球行动缓慢

Julia文档中的性能提示说

全局变量的值和类型可能会在任何时候发生变化。这使得编译器很难使用全局变量优化代码。变量应该是局部变量,或者尽可能作为参数传递给函数


任何对性能至关重要或正在进行基准测试的代码都应该在函数内部。

任何可以在函数外部编写的代码都可以在函数内部编写。就像C语言一样,你可以写

function main()
    print("Hello World\n")
end

main()
因此,只需假设它是一个C程序,并在main()函数中编写您的内容

为什么函数外的速度如此之慢,这是因为函数内的任何变量都受到保护,不会被其他线程或任务更改。因此,对于全局范围中的for循环,每次for循环访问它时都必须检查其变量的类型,以防它被另一个线程或任务更改。为了安全起见,所有这些检查都在放慢速度

朱莉娅的第一个表演法则是

全球行动缓慢

Julia文档中的性能提示说

全局变量的值和类型可能会在任何时候发生变化。这使得编译器很难使用全局变量优化代码。变量应该是局部变量,或者尽可能作为参数传递给函数


任何对性能至关重要或正在进行基准测试的代码都应该在函数中。

阅读性能提示。你所看到的是朱莉娅的第一条表演规则。非常感谢你!这帮了大忙!我可以看到这篇文章在刚刚发布的v1.0版本中吸引了大量的访问者,因此要扩展DNFs,请回答:在函数或模块之外定义的变量存在于全局范围内。Julia编译器无法保证全局范围内的变量不会更改其类型(除非它们声明为
const
,这确保了固定类型而不是固定值)。因此,除非您真的知道自己在做什么,否则全局范围内的任何代码都是缓慢的。外卖:始终将Julia例程包装在函数或模块中。第一次调用它们的速度很慢(编译时),但随后的调用速度很快。@ColinTBowers
const
确实声明变量是常量(如果您尝试重新定义常量,即使是相同类型的常量,也会收到警告)。@SimonByrne您是正确的。当我写评论时,我想到了可变类型(例如,您可以在不生成警告的情况下向
常量Dict
添加项),但无可否认,我也错误地认为更改不可变常量的值是可以的。谢谢你纠正我。请阅读性能提示。你所看到的是朱莉娅的第一条表演规则。非常感谢你!这帮了大忙!我可以看到这篇文章在刚刚发布的v1.0版本中吸引了大量的访问者,因此要扩展DNFs,请回答:在函数或模块之外定义的变量存在于全局范围内。Julia编译器无法保证全局范围内的变量不会更改其类型(除非它们声明为
const
,这确保了固定类型而不是固定值)。因此,除非您真的知道自己在做什么,否则全局范围内的任何代码都是缓慢的。外卖:始终将Julia例程包装在函数或模块中。第一次调用它们的速度很慢(编译时),但随后的调用速度很快。@ColinTBowers
const
确实声明变量是常量(如果您尝试重新定义常量,即使是相同类型的常量,也会收到警告)。@SimonByrne您是正确的。当我写评论时,我想到了可变类型(例如,您可以在不生成警告的情况下向
常量Dict
添加项),但无可否认,我也错误地认为更改不可变常量的值是可以的。谢谢你纠正我。