Для максимальной эффективности обычно требуется обрабатывать более одного бита за раз.
Вы можете использовать простой метод для получения двоичного представления с фиксированной шириной. например.
def _bin(x, width):
return ''.join(str((x>>i)&1) for i in xrange(width-1,-1,-1))
_bin (x, 8) теперь будет давать заполненное нулями представление младших 8 битов x. Это может быть использовано для построения справочной таблицы, позволяющей вашему конвертеру обрабатывать 8 бит за раз (или больше, если вы хотите посвятить ему память).
_conv_table = [_bin(x,8) for x in range(256)]
Затем вы можете использовать это в своей реальной функции, удаляя начальные нули при возврате. Я также добавил обработку для чисел со знаком, так как без него вы получите бесконечный цикл (концептуально, что у отрицательных целых чисел есть бесконечное число битов заданного знака).
def bin(x):
if x == 0:
return '0' #Special case: Don't strip leading zero if no other digits
elif x < 0:
sign='-'
x*=-1
else:
sign = ''
l=[]
while x:
l.append(_conv_table[x & 0xff])
x >>= 8
return sign + ''.join(reversed(l)).lstrip("0")
[Редактировать] Изменен код для обработки целых чисел со знаком.
[Edit2] Вот некоторые временные диаграммы различных решений. bin - функция выше, constantin_bin от ответ Константина , а num_bin - оригинальная версия. Из любопытства я также попробовал 16-битный вариант таблицы поиска выше (bin16 ниже) и попробовал встроенную функцию Python3 bin (). Все тайминги были для 100000 прогонов с использованием битовой комбинации 01010101.
Num Bits: 8 16 32 64 128 256
---------------------------------------------------------------------
bin 0.544 0.586 0.744 1.942 1.854 3.357
bin16 0.542 0.494 0.592 0.773 1.150 1.886
constantin_bin 2.238 3.803 7.794 17.869 34.636 94.799
num_bin 3.712 5.693 12.086 32.566 67.523 128.565
Python3's bin 0.079 0.045 0.062 0.069 0.212 0.201
Как вы можете видеть, когда обработка длинных значений с использованием больших кусков действительно окупается, но ничто не сравнится с низкоуровневым кодом C встроенного в python3 (который кажется странно быстрее при 256 битах, чем 128!) Использование 16-битной таблицы поиска улучшает ситуацию, но, вероятно, оно того не стоит, если оно вам действительно не нужно, поскольку оно использует большой кусок памяти и может вводить небольшую, но незначительную задержку при запуске для предварительного вычисления таблицы.