Пожалуйста, исправьте меня, если я ошибаюсь, но звучит так, будто вы написали какой-то длинный скрипт, скажем, myfile.jl
, а затем из командной строки вашей ОС вы вызываете julia myfile.jl args...
.Это правильно?Кроме того, похоже, что myfile.jl
не определяет многое в смысле функций, а представляет собой просто последовательность команд.Это правильно?Если так, то, как было предложено в комментариях к вопросу, это не типичный рабочий процесс для Юлии по двум причинам:
1) Вызов Джулии из командной строки, т. Е. julia myfile.jl args...
эквивалентно открытию REPL, выполнению команды include
на myfile.jl
и последующему закрытию REPL.Первоначальный вызов include
скомпилирует все методы, которые необходимы для операций в myfile.jl
, что требует времени.Но поскольку вы работаете из командной строки, после завершения include
REPL автоматически закрывается, и весь этот скомпилированный код выбрасывается.Это то, что имеет в виду DNF, когда он говорит, что рекомендуемый рабочий процесс должен работать в одном сеансе REPL, и не закрывайте его до тех пор, пока вы не закончите в течение дня или если вы намеренно не захотите перекомпилировать все используемые вами методы.
2) Даже если вы работаете в одном сеансе REPL, крайне важно обернуть практически все, что вы делаете в функциях (это совсем другой рабочий процесс по сравнению с такими языками, как Matlab).Если вы сделаете это, Джулия скомпилирует методы для каждой функции, которые специализируются на типах входных аргументов, которые вы используете.По сути, поэтому Юлия так быстро.После того, как метод скомпилирован один раз, он остается доступным для всего сеанса REPL, но удаляется при закрытии REPL.Крайне важно, что если вы не заключаете свои операции в функции, то эта специализированная компиляция не происходит, и поэтому вы можете ожидать очень медленный код.В юлии мы называем это «работой в глобальном масштабе».Обратите внимание, что эта особенность Джулии поддерживает стиль кодирования, состоящий из разбивки ваших задач на множество небольших специализированных функций, а не одного бегемота, состоящего из 1000 строк кода.Это хорошая идея по многим причинам.(в моей собственной кодовой базе многие функции являются однострочными, большинство - 5 или менее строк)
Два вышеприведенных пункта абсолютно необходимо понять, если вы работаете в Julia.Однако, как только вы освоитесь с ними, я бы порекомендовал вам фактически поместить все свои функции в modules , а затем вызывать ваши модули из активного сеанса REPL всякий раз, когда вам это нужно.Это дает дополнительное преимущество, заключающееся в том, что вы можете просто добавить оператор __precompile__()
в верхней части вашего модуля, а затем julia прекомпилирует часть (но не обязательно весь) кода в этом модуле.Как только вы это сделаете, предварительно скомпилированный код в вашем модуле не исчезнет, когда вы закроете REPL, так как он хранится на жестком диске в файле .ji.Таким образом, вы можете начать новый сеанс REPL, набрав using MyModule
, и ваш предварительно скомпилированный код будет немедленно доступен.Его нужно будет перекомпилировать, только если вы измените содержимое модуля (и все это происходит автоматически).