Python 2.4: скорость импорта в обычном скрипте против импорта в скрипте execfile - PullRequest
1 голос
/ 23 декабря 2010

Я только что наткнулся на то, что не имеет смысла для меня.Там, где я работаю, у нас есть несколько веб-страниц 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

Так что я решил обернуть некоторые из моих CGI-скриптов Python небольшим 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 «Корпоративный Linux Server версии 5 (Карфаген)».

1 Ответ

0 голосов
/ 23 декабря 2010

Я думаю, что нет никакой разницы. Это выглядит как большая разница. Попробуйте и убедитесь, что это так:

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