Цитата Сообщение от 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. заметил, что вставил версию без вызова функции, только с выборкой. Перепроверил, разницы нет, но на всякий случай -- в замеряемых циклах добавить ().