问题描述
我是 julia 新用户,即将编写我的第一个脚本。我使用 R、Matlab 和 python 进行数据分析,我还没有担心使用 c 或 java 的人会担心内存分配和更多高级编程。我想用 julia 来模拟一些生物数据,而在 python 中,这些类型的程序会变得非常慢。因此,当我阅读 memory allocation 部分中的性能提示时引起了我的注意。作为一个缺乏 C 等高级语言背景的人,我应该寻找什么?我在这里阅读了这篇文章,但这个 stack post 注意到一些错误的方式是因为他编译了 Python 代码,然后在 Julia 中运行。
当我有异常的内存分配时,我如何知道,相反,Julia 中的“良好”内存分配是什么样的?有没有办法根据我正在运行的内容确定不可接受的内存需求水平?
除了 @time
宏之外,您还有哪些其他校对技巧?
解决方法
要非常仔细地了解 Julia 性能问题,请阅读 https://docs.julialang.org/en/v1/manual/performance-tips/ 自己运行该页面中的所有示例。
通常,内存分配不是主要瓶颈。根据我的经验,当人们开始使用 Julia 时,类型稳定性和使用全局变量是所有性能问题的主要来源。
上面的文档也有关于内存分配的部分:
“意外的内存分配几乎总是表明您的代码存在问题,通常是类型稳定性问题或创建了许多小的临时数组。”
您会找到有关解决此类问题的详细讨论。
关于代码分析,您有以下工具:
-
@time
宏(请注意,第一次为给定方法运行它时,您实际上主要测量的是编译时间而不是运行时间。因此通常建议使用BenchmarkTools.jl
-
BenchmarkTools.jl
及其@btime
宏(其中包括 - 了解正在发生的事情的首选 - 内置分析 (https://docs.julialang.org/en/v1/manual/profile/) 以及
ProfileView.jl
和ProfileSVG.jl
包,可分别在独立和 Jupyter 环境中可视化分析数据 - 在最复杂的情况下,您可以使用
@code_lowered
、@code_typed
和@code_native
来查看各个编译阶段的代码
这些是基础和最有用的工具,可帮助您开始编写高性能的 Julia 代码。