Нет. Это не так. Для ключа типа int это поиск ровно такой-же как и смещение в массиве. В питон3.6 и выше это поведение еще более оптимизировали.CityAceE, в ассоциативной таблице выборка по ключу это поиск в хеш таблице. Операция O(1) формально, но на практике довольно сложная. Выборка из линейного массива это просто вычисление смещения. В Питоне может быть и невелика будет разница, но я бы попробовал.
@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
Написал тестик:
2,511099100112915 сек.Код: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,5191421508789062 сек.Код: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)
Весьма показательно. 0.3% разницы на 1 миллионе вызовов.




Ответить с цитированием