#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