Влияет ли длина имени переменной на скорость работы программы?
У меня есть небольшой кусочек кода, который должен выполняться долго и долго. Мне интересно, может ли длина имен переменных, которые я использую, повлиять на скорость выполнения программы. Вот очень простой пример, написанный на Python.
Программа А
x = 1
while not x == 0:
print('message')
Программа Б
xyz = 1
while not xyz == 0:
print('message')
Будет ли программа A печатать "сообщение" больше раз, чем программа B, если я запускаю программу A и программу B в течение 30 лет на двух идентичных машинах.
3 ответа
Нет, сами имена не влияют на скорость выполнения результирующего кода. Имена переменных просто используются для различения в источнике Python двух переменных, которые представлены целочисленными индексами в справочной таблице:
>>> dis.dis('x=1')
1 0 LOAD_CONST 0 (1)
2 STORE_NAME 0 (x)
4 LOAD_CONST 1 (None)
6 RETURN_VALUE
>>> dis.dis('xyz=1')
1 0 LOAD_CONST 0 (1)
2 STORE_NAME 0 (xyz)
4 LOAD_CONST 1 (None)
6 RETURN_VALUE
>>> dis.dis('x=1;xyz=2;')
1 0 LOAD_CONST 0 (1)
2 STORE_NAME 0 (x)
4 LOAD_CONST 1 (2)
6 STORE_NAME 1 (xyz)
8 LOAD_CONST 2 (None)
10 RETURN_VALUE
В первых двух вы заметите, что в результирующем байтовом коде не делается никаких различий. В последнем случае вы увидите, что байт-код различает два, но только в порядке, в котором они определены, а не в длине метки.
Результаты, упомянутые @chepner, верны, Python может потребоваться больше времени для запуска кода в консоли, но после компиляции кода результаты будут такими же.
Чтобы убедиться, что это правильно, я создал следующий код, также вдохновленный ответом @knifer:
from time import time
from numpy import average,std
x = 1
xyzabcdexyzabcdefghidjakeldkjlkfghidjakeldkjlk = 1
short_runs = 0
long_runs = 0
for _ in range(int(2e7)):
t0 = time()
if x:
pass
short_runs += time() - t0
t0 = time()
if xyzabcdexyzabcdefghidjakeldkjlkfghidjakeldkjlk:
pass
long_runs += time() - t0
print('Runtime results:')
print(f"Small variable runs : (sum = {short_runs:.3f})")
print(f"Long variable runs : (sum = {long_runs :.3f})")
Предлагаемый мной код несколько отличается в том смысле, что пробная версия выполняется в течение длительного времени, а короткие имена переменных взаимосвязаны, так что любые различия, вызванные базовыми процессами ОС, сводятся к минимуму.
Результаты кода зависят от того, вводите ли вы код в консоль Python или вызываете код как программу (
PS. Фактическое время работы у меня все время меняется (в ту или иную сторону), поэтому трудно сообщить точные значения. Даже длинные имена переменных иногда могут работать быстрее, хотя в консоли Python такое бывает очень редко. Самый главный вывод - любые различия в любом случае действительно небольшие :)
Разница очень мала, и мы не можем сделать вывод, что это из-за имени переменной.
import timeit
x=1
xyz=1
start_time = timeit.default_timer()
for i in range(1,1000000):
if x==1:
print("message")
elapsed = timeit.default_timer() - start_time
start_time2 = timeit.default_timer()
for i in range(1,1000000):
if xyz==1:
print("message")
elapsed2 = timeit.default_timer() - start_time2
print("small variable printing = ",str(elapsed),"big variable printing = "+str(elapsed2))
И результат был:
small variable printing = 3.6490847053481588 big variable printing = 3.7199463989460435