
Сообщение от
CityAceE
Хотя в Python я ещё ни разу не использовал вызов функции по значению из списка - пользовался только вызовом по словарю, как в этом эмуляторе. И даже не знаю осуществимо ли это? Видимо, осуществимо.
Конечно осуществимо. И из списка и из тупли.
Написал незамысловатый бенчмарк. С современными компами и интерпретируемыми языками уровня питона такие бенчмарки мало толку дают. У меня получается разброс в 10% между запусками, слишком много внешних воздействий. В среднем, как мне показалось, тупля незначительно опережает список, список незначительно опережает словарь, но в общем это ловля блох и вряд ли эмулятор ускорится в два раза от такой переделки. Хотя в реальном коде разница может оказаться другой и, учитывая то, что попробовать вообще ничего не стоит, по-моему стоит попробовать 
Код:
import time
def foo(): return 'foo'
def bar(): return 'bar'
disp=[foo if i & 1 else bar for i in range(256)]
dict={}
for i in range(256):
dict[i] = foo if i & 1 else bar
niter = 100000000
print("dispatch using list")
start_time = time.time()
for i in range(niter):
u = disp[i & 255]()
elapsed_time = time.time() - start_time
print("elapsed time=", elapsed_time)
print("dispatch using dictionary")
start_time = time.time()
for i in range(niter):
u = dict[i & 255]()
elapsed_time = time.time() - start_time
print("elapsed time=", elapsed_time)
tust=tuple(disp)
print("dispatch using tuple")
start_time = time.time()
for i in range(niter):
u = tust[i & 255]()
elapsed_time = time.time() - start_time
print("elapsed time=", elapsed_time)
- - - Добавлено - - -
P.S. заметил, что вставил версию без вызова функции, только с выборкой. Перепроверил, разницы нет, но на всякий случай -- в замеряемых циклах добавить ().