J'ai un objet "bytes" et un masque "int", je veux faire un xor sur tous les octets avec mon masque. Je répète cette action sur de gros objets "bytes" (~ 4096 Ko).Python - "xor" chaque octet dans "octets" de la manière la plus efficace
C'est le code que j'ai qui fait le travail bien, seulement il est très consommateur d'UC et ralentit mon script:
# 'data' is bytes and 'mask' is int
bmask = struct.pack('!I', mask) # converting the "int" mask to "bytes" of 4 bytes
a = bytes(b^m for b, m in zip(data, itertools.cycle(bmask)))
Le mieux que je pouvais trouver est ce qui est environ 20 fois plus rapide:
# 'data' is bytes and 'mask' is int
# reversing the bytes of the mask
bmask = struct.pack("<I", mask)
mask = struct.unpack(">I", bmask)[0]
# converting from bytes to array of "int"s
arr = array.array("I", data)
# looping over the "int"s
for i in range(len(arr)):
arr[i] ^= mask
# must return bytes
a = bytes(arr)
Mes questions sont les suivantes:
- Est-il possible de le faire (CPU-Wize) plus efficace?
- Existe-t-il un moyen plus "propre" de faire cela (sans nuire aux performances)?
P.S. si c'est important, j'utilise Python 3.5
Qu'est-ce 'data'? Est-ce une liste ou des octets ou un itérateur ou ..? –
Si c'est un goulot d'étranglement, il serait logique d'écrire une fonction C appelée de Python –
"données" est des octets, je vais mettre à jour la question –