Mam obiekt" bajtów "i" int "maski, chcę zrobić xor na wszystkie bajty z moją maską. Wykonuję tę akcję wielokrotnie nad dużymi obiektami "bajtowymi" (~ 4096 KB).Python - "xorowanie każdego bajtu w" bajtach "w najbardziej efektywny sposób
Jest to kod mam, które działa dobrze, tylko jest to bardzo obciąża CPU i spowalnia mój skrypt:
# '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)))
Najlepszym mogłem wymyślić jest ten, który jest około 20 razy szybciej:
# '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)
moje pytania są następujące:
- Czy jest bardziej efektywny sposób to zrobić (CPU-Wize)?
- Czy istnieje "czystszy" sposób, aby to zrobić (bez ranienia wydajności)?
P.S. jeśli to ma jakiekolwiek znaczenie, używam Python 3.5
Co jest 'data'? Czy jest to lista, bajty, iteratory czy ...? –
Jeśli jest wąskim gardłem, to może mieć sens, aby napisać funkcję o nazwie C od Python –
„dane” jest bajtów, będę aktualizować pytanie –