Python: eficiente incremento de bytearray

¿Cómo iterar todos los valores posibles de bytearray of length = n en Python? en el peor de los casos n <= 40bytes

Por ejemplo, iterar para n = 4 :

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000010 . . . . 11111111 11111111 11111111 11111110 11111111 11111111 11111111 11111111 

Inspirado en https://stackoverflow.com/a/15538456/1219006

 n = 2 [[[i>>k&1 for k in range(j, j-8, -1)] for j in range(8*n-1, 0, -8)] for i in range(2**(8*n))] 

Tendrá que ejecutar esto en Python 3 para n grandes porque xrange no admite grandes entradas.

Como generador:

 def byte_array(n): for i in range(2**(8*n)): yield [[i>>k&1 for k in range(j, j-8, -1)] for j in range(8*n-1, 0, -8)] 

 >>> i = byte_array(4) >>> next(i) [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]] >>> next(i) [[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1]] 

O si no los quieres agrupados es más sencillo:

 [[i>>j&1 for j in range(8*n-1, -1, -1)] for i in range(2**(8*n))] 

Generador equivalente:

 def byte_array(n): for i in range(2**(8*n)): yield [i>>j&1 for j in range(8*n-1, -1, -1)] 

Puedes usar itertools.product :

 In [11]: from itertools import product In [15]: for x in product('01',repeat=4): #for your n=4 change repeat to 32 print "".join(x) ....: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111