Bits list to integer in Python
You can use bitshifting:
out = 0for bit in bitlist: out = (out << 1) | bit
This easily beats the "int cast" method proposed by A. R. S., or the modified cast with lookup proposed by Steven Rumbalski:
>>> def intcaststr(bitlist):... return int("".join(str(i) for i in bitlist), 2)... >>> def intcastlookup(bitlist):... return int(''.join('01'[i] for i in bitlist), 2)... >>> def shifting(bitlist):... out = 0... for bit in bitlist:... out = (out << 1) | bit... return out... >>> timeit.timeit('convert([1,0,0,0,0,0,0,0])', 'from __main__ import intcaststr as convert', number=100000)0.5659139156341553>>> timeit.timeit('convert([1,0,0,0,0,0,0,0])', 'from __main__ import intcastlookup as convert', number=100000)0.4642159938812256>>> timeit.timeit('convert([1,0,0,0,0,0,0,0])', 'from __main__ import shifting as convert', number=100000)0.1406559944152832
...or using the bitstring module
>>> from bitstring import BitArray>>> bitlist=[1,0,0,0,0,0,0,0]>>> b = BitArray(bitlist)>>> b.uint128
I came across a method that slightly outperforms Martijn Pieters solution, though his solution is prettier of course. I am actually a bit surprised by the results, but anyway...
import timeitbit_list = [1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0]def mult_and_add(bit_list): output = 0 for bit in bit_list: output = output * 2 + bit return outputdef shifting(bitlist): out = 0 for bit in bitlist: out = (out << 1) | bit return outn = 1000000t1 = timeit.timeit('convert(bit_list)', 'from __main__ import mult_and_add as convert, bit_list', number=n)print "mult and add method time is : {} ".format(t1)t2 = timeit.timeit('convert(bit_list)', 'from __main__ import shifting as convert, bit_list', number=n)print "shifting method time is : {} ".format(t2)
Result:
mult and add method time is : 1.69138722958 shifting method time is : 1.94066818592