Ускорить начальное выполнение приложения командной строки Python

#python #command-line

#python #командная строка

Вопрос:

Я создал прототип приложения командной строки для быстрого создания заметок с использованием Python и argparse. Прямо сейчас он в основном просто запускает Vim, а затем помещает буфер в базу данных SQLite.

Проблема в том, что загрузка Python происходит медленно на обеих моих машинах (~ 2/3 ГГц Intel Core 2 Duos), а самая базовая функциональность (печать меню справки при запуске) может занять более секунды. Я знаю, что мой код в порядке, потому что Python работает очень быстро, а интерактивный режим запускается сразу после загрузки Python, но я могу имитировать свое раздражение простым приветственным словом:

 $ time python -c "print 'hello world'"
hello world
real    0m0.669s
user    0m0.070s
sys     0m0.041s
  

Конечно, проблема не уникальна для Python:

 $ time erl -noshell -eval 'io:fwrite("Hello, World!n"), init:stop().'
Hello, World!
real    0m2.824s
user    0m0.253s
sys     0m0.104s
  

Мой вопрос: как я могу ускорить начальное выполнение приложения Python?Я хочу, чтобы моя программа выглядела как git или wc .

Система: я сталкиваюсь с этой проблемой с python2.6 в OS X 10.6.8 и с python2.7 в OS X 10.7.2.

Примечание: последующие выполнения python erl ) выполняются намного быстрее, но я уже занимаюсь этой программой и хочу, чтобы она была действительно быстрой.

Обновление: я попытался запустить pypy и обнаружил, что время начальной загрузки аналогично python2.6 и 2.7 в обеих моих системах (~ .5 секунд при начальной загрузке), что вдвое меньше производительности при последующих вызовах по сравнению с python2.6 в OS X 10.6.8 (~.08s для pypy, ~.35sдля 2.6) и аналогичную производительность при последующих вызовах по сравнению с python2.7 в OS X 10.7.2 (~ .08s для pypy и python2.7).

Обновление 2: вывод из предложения доктора Джимбоба (похоже, это сокращает начальное время загрузки на 2/3) —

 $ python -vSEc "print 'hello world'"
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
import encodings # directory /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/encodings
# /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/encodings/__init__.pyc matches /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/encodings/__init__.py
import encodings # precompiled from /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/encodings/__init__.pyc
# /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/codecs.pyc matches /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/codecs.py
import codecs # precompiled from /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/codecs.pyc
import _codecs # builtin
# /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/encodings/aliases.pyc matches /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/encodings/aliases.py
import encodings.aliases # precompiled from /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/encodings/aliases.pyc
# /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/encodings/utf_8.pyc matches /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/encodings/utf_8.py
import encodings.utf_8 # precompiled from /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/encodings/utf_8.pyc
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
hello world
# clear __builtin__._
# clear sys.path
# clear sys.argv
# clear sys.ps1
# clear sys.ps2
# clear sys.exitfunc
# clear sys.exc_type
# clear sys.exc_value
# clear sys.exc_traceback
# clear sys.last_type
# clear sys.last_value
# clear sys.last_traceback
# clear sys.path_hooks
# clear sys.path_importer_cache
# clear sys.meta_path
# clear sys.flags
# clear sys.float_info
# restore sys.stdin
# restore sys.stdout
# restore sys.stderr
# cleanup __main__
# cleanup[1] zipimport
# cleanup[1] _codecs
# cleanup[1] signal
# cleanup[1] encodings
# cleanup[1] encodings.utf_8
# cleanup[1] encodings.aliases
# cleanup[1] exceptions
# cleanup[1] _warnings
# cleanup[1] codecs
# cleanup sys
# cleanup __builtin__
# cleanup ints: 3 unfreed ints
# cleanup floats

real    0m0.267s
user    0m0.009s
sys     0m0.043s
  

Комментарии:

1. Какая это версия python? Какая платформа? На Fedora я получаю 0,029 с при первом запуске. У вас много путей в вашем $PATH , является ли python одним из первых путей?

2. В зависимости от вашей ситуации, простой запуск nop скрипта в вашем .bashrc файле или аналогичный может решить вашу проблему. Однако это не совсем «хорошее решение».

3. Забавно; на моей машине core 2 duo core (E8400) с частотой 3 ГГц (работающей на частоте 2 ГГц) я получаю time python -c "print 'hello world'" 0,018 с в реальном времени.

4. И ваше время пользователя и системы нигде близко не соответствует реальному времени. У вас достаточно свободной памяти?

5. Можете ли вы попробовать запустить python -vSEc "print 'hello world'" (-v для печати сообщения в каждом модуле; -S отключить import site , -E игнорировать переменные среды). (Я не могу перезагрузить mac, поскольку кто-то его использует).

Ответ №1:

Вы можете использовать аналогичную технику, используемую печально известным «Microsoft Office Quick Start» или «Java Quick Start» и, IIRC, даже «Adobe Fast-something»…

Хитрость заключается в том, чтобы попытаться постоянно сохранять все библиотеки программы в кэше диска.

Вы можете получить его с помощью простой команды crontab, запрограммированной на запуск один раз в час. Точные детали будут зависеть от вашей системы, но должны работать с чем-то вроде:

 $ crontab -e
0 * * * * python -c 'pass'
  

Хотя для меня более эффективным является написание простого скрипта Python, который импортирует все модули, которые использует ваша программа, а затем просто завершает работу.

Комментарии:

1. 1 Это, вероятно, в конечном итоге станет решением, но я собираюсь обдумать это еще день или два. (На самом деле, решением, скорее всего, будет игнорирование проблемы и получение лучшего компьютера :-p)

2. @CodyHess Хорошая работа, доказывающая правильность закона Мура (наблюдение): P