Tôi có đối tượng "byte" và mặt nạ "int", tôi muốn thực hiện xor trên tất cả các byte bằng mặt nạ của mình. Tôi thực hiện hành động này nhiều lần trên các đối tượng "byte" lớn (~ 4096 KB).Python - "xor" ing từng byte theo "byte" theo cách hiệu quả nhất
Đây là mã tôi có mà không làm việc tốt, chỉ có nó là rất CPU chuyên sâu và chậm kịch bản của tôi:
# '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)))
Điều tốt nhất tôi có thể đưa ra là thế này, đó là khoảng 20 lần nhanh hơn:
# '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)
câu hỏi của tôi là:
- có cách nào hiệu quả hơn để làm điều này (CPU-wize)?
- Có cách nào "sạch hơn" để thực hiện điều này (mà không làm tổn thương hiệu suất) không?
P.S. nếu nó quan trọng, tôi đang sử dụng Python 3.5
'Dữ liệu' là gì? Nó là một danh sách hoặc byte hoặc iterator hay ..? –
Nếu nó là một nút cổ chai, nó có thể làm cho tinh thần để viết một hàm C được gọi là từ Python –
"dữ liệu" là byte, tôi sẽ cập nhật các câu hỏi –