Если ваш «j» зафиксирован, вы можете записать число в буквальной форме вместо использования «j» - компилятор Python записал бы «1 << j» как литерал, и у вас была бы одна операция вместо двух(То есть, если «j» не является переменной и всегда, скажем, «10204», вы должны написать <code>1 << 10204)
Тем не менее, я думаю, что вы представляете себе, что этот алгоритм запускается как «спокойно толкающий1 000 бит слева, один за другим »- это не то, что происходит.
Алгоритм для больших целых чисел, вероятно, значительно оптимизирует создание целого числа« 1 << j »- и в то же времярезультат того, что <code>& n будет «линейным», все равно будет очень быстрой операцией.
В общем, если после того, как вы запустили и профиль вашего приложения показывает, что в этой операции есть замедление, есть библиотеки с большими целыми числами, которые могут превзойти собственные целые числа Python более чем на один порядоквеличина.
В прошлом я использовал библиотеку GMP2 - доступную для Python как gmpy2 и получил хорошие результаты. \
Что касается специфики вашего вопроса о попыткахчтобы ускорить процесс, написав другие выражения для битового тестирования: это определенно неправильный подход -
Если бы это было так, если бы числа в Python были слишком медленными и быстрееВ числовых библиотеках, совсем не поддерживающих битовое тестирование, вы должны выкатить свои собственные целочисленные типы, которые будут хранить номера ошибок в байтовом массиве с 8 битами на байт, и написать собственный метод «битового сравнения» для этих чисел.
Ускорение, которое вы получите по сравнению с обычным битовым тестированием &
, заключается в том, что ваша функция заранее знает, что она должна соответствовать одному биту в одном из операндов, и не должна искать другой "1 "бит в другом операнде - поэтому операция будет O (1).
Но я бы поспорил, что ускорение, которое вы получите от этого, будет слишком маленьким - имейте в виду, чтопри «преждевременной оптимизации - корень зла».
обновление : gmp не быстрее для построения номера 1 << j: </p>
In [22]: a = bmpy2.numer(1); b = gmpy2.numer(10_000_000)
In [23]: %timeit a << b
25.8 µs ± 508 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [24]: %timeit 1 << 10_000_000
27.2 µs ± 239 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)