Jupyter – очень известная среда разработки в области анализа данных. Использование Jupyter для написания кода, связанного с анализом данных, значительно сократит время разработки.
Представьте такой сценарий: коллеги из других отделов передают вам модуль анализа данных для реализации расширенного анализа данных. В модуле сотни функций.
Если вы напрямую пишете файл Python для вызова модуля анализа данных, использование очень простое:
from analyze import FathersAnalyzer
data = [...]
father = FathersAnalyzer(data)
result = father.analyze()
print(f'分析结果为:{result}')
Теперь вам нужно использовать Jupyter для вызова этого модуля анализа. Как вы должны называть это в Jupyter?
Вы можете подумать, разве это не легко? Непосредственно объедините код этого модуля с кодом Jupyter Notebook..ipynb
Соедините файлы вместе, а затем импортируйте их в Jupyter, как обычный модуль, как показано на следующем рисунке:
Итак, теперь возникает проблема, если я изменю его в это времяanalyze.py
файл, что будет?
Изменим его, как показано на рисунке ниже.
Повторно запустите код в этой ячейке, несмотря на то, что кодfrom analyze import FathersAnalyzer
, похоже модуль переимпортирован, но когда я его запускаю, он запускает код до модификации.
Это связано с тем, что весь код в блокноте Jupyter — это код, который выполняется в одной и той же среде выполнения. При многократном импорте одного и того же модуля механизм управления пакетами Python автоматически игнорирует последующие импорты и всегда использует только первый модуль. один импорт (так что шаблон singleton также может быть реализован таким образом).
Так что, если я хочу повторно импортировать импортированный пакет после его изменения? Есть 3 варианта:
- Перезапустите весь ноутбук. Но это приведет к потере всех переменных в текущей среде выполнения.
- использовать
importlib
:
Но очевидны и недостатки этой схемы — если вы не будете запускать каждую ячейку последовательно, ваш код станет таким:
Модуль анализа нужно перезагружать в каждую ячейку, иначе очень вероятно, что при запуске одной ячейки будет использоваться старый код, что приведет к малозаметным багам.
- Используйте собственный
%autoreload
:
%load_ext autoreload
%autoreload 1
%aimport analyze
data = 123
importlib.reload(analyze)
father = analyze.FathersAnalyzer(data)
result = father.analyze()
print(result)
Эффект операции показан на следующем рисунке:
Код ключа состоит из трех строк:
%load_ext autoreload
%autoreload 1
%aimport analyze
Эти три строки кода могут нормально работать только в Jupyter, и об ошибке будет сообщено в обычном файле .py. Что они делают: начинается строка 1autoreload
механизм. Строка 2, установить автозагрузку через%aimport
импортные модули. Строка 3 использует%aimport
импортanalyze
модуль.
После того, как это будет записано, запускается любая ячейка, все%aimport
Импортированные модули перезагружаются один раз. Это позволяет вам использовать последний код каждый раз.
Конечно, можно еще больше полениться и сократить специальный код до 2 строк:
%load_ext autoreload
%autoreload 2
%autoreload
Когда для последнего параметра установлено значение 2, при каждом запуске любой ячейки все ячейки будут автоматически перезагружаться.import xxx
импортные модули. Компромисс для этого заключается в том, что он будет работать медленнее.