Python 2.4: скорость импорта в обычном скрипте против импорта в скрипте execfile
Я только что наткнулся на то, что не имеет смысла для меня. Там, где я работаю, у нас есть несколько веб-страниц Python CGI (простая настройка сервера Apache, без запуска Django / Turbogears и т. П.), И я был немного разочарован тем, как долго скрипты запускаются. Я бросил много вызовов time.time () и подумал, что определил узкое место как импорт sqlalchemy (хотя теперь я думаю, что это, вероятно, "любой большой модуль", поэтому тег sqlalchemy, возможно, неуместен).
Поэтому, попробовав разные вещи, я закончил с этим примером (предположим, файл называется test.py)
#!/usr/bin/python
import time
t1 = time.time()
import sqlalchemy
print time.time() - t1
Если я запускаю test.py в командной строке (устанавливая его исполняемым), он обычно показывает около 0,7 секунды (+/- 0,1 секунды) для этого оператора импорта.
Но если я позвоню
python -c "execfile('test.py')"
Я набираю скорость примерно в 10 раз
Поэтому я решил обернуть некоторые из моих скриптов Python CGI небольшим скриптом tcsh, который вызывает
python -c "execfile('mypythoncgiscript.py')"
и я получаю ускорения, как правило, в 2-3 раза, и, что важно, возвращаемые данные все еще верны.
С тяжелым процессором, а не импортным сценарием, например:
t1 = time().time()
a = 0
for i in xrange(10000000):
a += 1
print time.time() - t1
Я получаю очень небольшое замедление при использовании execfile, чего я и ожидал от небольших накладных расходов execfile.
Кто-нибудь знает, что здесь происходит? Может кто-нибудь воспроизвести подобные различия в скорости или моя установка сломана таким образом, что execfile каким-то образом исправляет? Я думал, что импорт в execfile ведет себя немного по-другому (или, по крайней мере, не обязательно виден после того, как вы оставили оператор execfile), но я удивлен такой большой разницей в скорости.
Я использую Python 2.4 64bit на поставляемой Oracle "Enterprise Linux Server версии 5 (Карфаген)".
1 ответ
Я думаю, что нет никакой разницы. Это выглядит как большая разница. Попробуйте и убедитесь, что это так:
# time python test.py
0.0514879226685
python test.py 0.06s user 0.01s system 95% cpu 0.071 total
# time python -c 'execfile
0.0515019893646
python -c 'execfile("test.py")' 0.06s user 0.01s system 95% cpu 0.071 total