gpt4 book ai didi

compilation - 如果从命令行运行 Julia 脚本,是否每次都需要重新编译?

转载 作者:行者123 更新时间:2023-12-04 17:30:32 25 4
gpt4 key购买 nike

我已经阅读了很多文档和问题,但我仍然对此感到困惑。

Profiling文档的部分建议首先在 REPL 中运行目标函数一次,以便它在被分析之前已经编译。但是,如果脚本相当复杂并且打算在命令行中运行并接受参数怎么办?当julia进程完成,我第二次运行脚本,是否再次执行编译?像 https://stackoverflow.com/a/42040763/1460448 这样的帖子, Julia compiles the script every time?给出相互矛盾的答案。当 Julia 不断发展时,它们似乎也很老了。

在我看来,根据我的经验,第二次运行所花费的时间与第一次运行的时间完全相同。启动时间相当长。我应该如何优化这样的程序?添加 __precompile__()似乎根本没有改变执行时间。

另外,当我想分析这样的程序时应该怎么做?所有关于分析的资源都在 REPL 中讨论了这样做。

最佳答案

如果我错了,请纠正我,但听起来你写了一些很长的脚本,比如说,myfile.jl ,然后从您的操作系统命令行调用 julia myfile.jl args... .它是否正确?此外,它听起来像 myfile.jl在函数的方式上没有定义太多,而只是一个命令序列。它是否正确?如果是这样,那么正如对该问题的评论中所建议的那样,这不是 Julia 的典型工作流程,原因有两个:

1) 从命令行调用julia,即julia myfile.jl args...相当于打开一个 REPL,运行 include命令 myfile.jl ,然后关闭 REPL。首次调用 include将编译 myfile.jl 中的操作所需的任何方法,这需要时间。但是由于您是从命令行运行的,一旦 include完成后,REPL 自动关闭,所有编译后的代码都被丢弃。这就是 DNF 的意思,他说推荐的工作流程是在单个 REPL session 中工作,并且在您完成一天之前不要关闭它,或者除非您有意重新编译您正在使用的所有方法。

2) 即使您在单个 REPL session 中工作,将您所做的几乎所有事情都包装在函数中也非常重要(这与 Matlab 等语言的工作流程非常不同)。如果您这样做,Julia 将为每个函数编译专门针对您正在使用的输入参数类型的方法。这基本上就是 Julia 速度快的原因。一旦一个方法被编译一次,它在整个 REPL session 中仍然可用,但在你关闭 REPL 时被释放。至关重要的是,如果您不将操作包装在函数中,则不会发生这种专门的编译,因此您可能会遇到非常慢的代码。在 Julia 中,我们称之为“在全局范围内工作”。请注意,Julia 的这一特性鼓励一种编码风格,即把你的任务分解成许多小的专用函数,而不是一个由 1000 行代码组成的庞然大物。这是一个好主意,原因有很多。 (在我自己的代码库中,很多函数都是单行的,大多数是 5 行或更少)

如果您在 Julia 中工作,以上两点对于理解这一点绝对至关重要。但是,一旦您对它们感到满意,我建议您实际上将所有功能放入 modules ,然后在需要时从事件的 REPL session 中调用您的模块。这有一个额外的好处,你可以添加一个 __precompile__()声明在您的模块顶部,然后 julia 将预编译该模块中的一些(但不一定是全部)代码。完成此操作后,关闭 REPL 时模块中的预编译代码不会消失,因为它以 .ji 文件的形式存储在硬盘驱动器上。所以你可以开始一个新的 REPL session ,输入 using MyModule ,并且您的预编译代码立即可用。如果你改变了模块的内容,它只需要重新编译(这一切都是自动发生的)。

关于compilation - 如果从命令行运行 Julia 脚本,是否每次都需要重新编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50608970/

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