CityAceE, в ассоциативной таблице выборка по ключу это поиск в хеш таблице. Операция O(1) формально, но на практике довольно сложная. Выборка из линейного массива это просто вычисление смещения. В Питоне может быть и невелика будет разница, но я бы попробовал.
Нет. Это не так. Для ключа типа int это поиск ровно такой-же как и смещение в массиве. В питон3.6 и выше это поведение еще более оптимизировали.
@CityAceE: Оставь диктом. Флаги у тебя тоже верно сделаны, т.к. смысла тащить их везде в виде битмаски абсолютно не нужно. Титус прав насчет расчетов, но ошибается насчет переносимости. В питон битовые операции будут сильно медленнее чем обычная математика. Если уж на то пошло, то можно использовать какую-нибудь библиотеку. Тот-же rlca переписаный слегка из pyzx:
Код:
def rlca():
global _f3, _f5, _fN, _fH, _fC
ans = _A[0]
c = (ans & 0x80) != 0
ans = (((ans << 1) | 0x01) if c else (ans << 1)) % 256
_f3 = ((ans & F_3) != 0)
_f5 = ((ans & F_5) != 0)
_fN = False
_fH = False
_fC = c
_A[0] = ans
return 4
- - - Добавлено - - -
Написал тестик:
Код:
from random import randint
import timeit
def foo(): return 'foo'
def bar(): return 'bar'
disp=[foo if i & 1 else bar for i in range(256)]
def test(): u = disp[randint(0, 255)]()
timeit.timeit(test, number=100000000)
2,511099100112915 сек.
Код:
from random import randint
import timeit
def foo(): return 'foo'
def bar(): return 'bar'
disp={i: (foo if i % 2 else bar) for i in range(256)}
def test(): u = disp[randint(0, 255)]()
timeit.timeit(test, number=100000000)
2,5191421508789062 сек.
Весьма показательно. 0.3% разницы на 1 миллионе вызовов.