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
Другие вопросы по тегам