Почему "python -mtimeit" показывает меньше времени, когда код содержит импорт некоторых модулей? - PullRequest
1 голос
/ 18 сентября 2010

На моем одноядерном компьютере с тактовой частотой 1,4 ГГц я выполнил следующие 2 временных кода:

suzan:~$ python -mtimeit "
def count(n):
    while n > 0:
        n -= 1
count(10000000)
"
10 loops, best of 3: 1.73 sec per loop
suzan:~$
suzan:~$ python -mtimeit "
import os       
def count(n):
    while n > 0:
        n -= 1
count(10000000)
"
10 loops, best of 3: 1.18 sec per loop
suzan:~$ 

Вторая команда timeit показывает меньшее время, чем первая, даже если она содержит одну дополнительную строку кода "импорт ос ".Это необычное поведение или ожидаемое?

Любая помощь очень ценится.

Ответы [ 2 ]

1 голос
/ 17 октября 2010

Единственная возможная причина, по которой я могу придумать, может объяснить такое поведение, не должно иметь значения: отсутствует строка кэша L1, и я имею в виду кэш данных (байт-коды Python VM не являются исполняемым кодом для вашего процессора). Код вашей функции count хранится как отдельный объект кода, и его начальный адрес или скорость не должны зависеть от кода установки. Это очень нерегулярное поведение.

Что делает ваш процессор? Ваша версия Python? Ваша версия ОС? И повторяются ли результаты теста?

1 голос
/ 18 сентября 2010

Я получаю эффективно (с точностью до 0,4%) одновременно с обоими фрагментами.Python импортирует модуль os как часть обычного импорта

>>> import sys
>>> "os" in sys.modules
True
>>> 

, поэтому второй бит кода с «import os» даже не попадает на диск.Все, что он делает - это проверяет sys.modules.

Вы можете проверить, дает ли import builtins такую ​​же реакцию, но я действительно не могу объяснить, что вы видите.Вы можете включить опцию (ы) -v при запуске Python, чтобы получить немного больше информации о том, что он делает, и сравнить результаты.Они должны быть идентичны.

...