Почему импортированная функция медленнее в Python - PullRequest
0 голосов
/ 01 октября 2018

Я попытался реструктурировать свой код, чтобы определить функцию в другом файле, и заметил, что она работает немного медленнее.Мне интересно, знает ли кто-нибудь, как предотвратить это замедление или есть известная причина для этого.Я понял, что импорт в python - это то же самое, что и вставка кода при копировании, поэтому это замедление странно для меня.

Пример:

from datetime import datetime
from import_test import small_test_import

def small_test(x):
    return x+1

start1 = datetime.now()
for i in range(x):
    Z=small_test(1)
end1 = datetime.now()
print(end1-start1) #1.355964

start2 = datetime.now()
for i in range(x):
    Z=small_test_import(1)
end2 = datetime.now()
print(end2-start2) #1.433045

или использовать timeit:

def wrapper(func, *args, **kwargs):
    def wrapped():
         return func(*args, **kwargs)
    return wrapped

wrapped = wrapper(small_test, 1)
print(timeit.timeit(wrapped,number=x)) #1.8407
wrapped = wrapper(small_test_imported, 1)
print(timeit.timeit(wrapped, number=x)) #2.1006

Я понимаю, что это не огромная разница во времени, но она последовательна.

1 Ответ

0 голосов
/ 01 октября 2018

Разница во времени, которую вы печатаете в вашем скрипте, показывает разницу примерно в 0,8 секунды, если я не ошибаюсь?Импортированная функция, скорее всего, не медленнее, но ваша тестовая настройка дает ей недостаток: она должна очистить существующий объект Z.Ваш скрипт повторно использует переменную Z, поэтому второй цикл for должен очистить объект (возвращаемое значение), который вы связали с Z в первом тесте.

Попробуйте повторить измерениес этим кодом:

start1 = datetime.now()
for i in range(x):
    X = small_test(1)
end1 = datetime.now()
print(end1-start1)

start2 = datetime.now()
for i in range(x):
    Y = small_test_import(1)
end2 = datetime.now()
print(end2-start2)

Это не должно привести к заметной разнице.

...