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

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

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

$ 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.

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

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

Обновление 2: выход из предложения dr jimbob (это, похоже, сокращает начальное время загрузки на 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 

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

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

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

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

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