Сравнение скорости между питоном родным поразрядно
У меня есть некоторый код, и в этом коде мне нужно вычислить контрольную сумму (перед передачей и на полученных данных). При простой проверке времени был потрачен сравнительно большой промежуток времени на его вычисление и проверку. Имея в своем распоряжении 210 000 пакетов, это имеет смысл.
Читая через несколько сайтов (и SO выскочил несколько раз), numpy побитовое происходит быстрее, чем нативный ( самый быстрый битовый xor между двумя многобайтовыми переменными двоичных данных)
Точно так же я изучил lru_cache, так как в большинстве случаев могу отдать должное, очень похожие запросы.
Я попробовал это и получил некоторые странные результаты.
!/usr/bin/env python
#-*- coding: utf-8 -*-
from functools import lru_cache
from numpy import bitwise_and, invert, bitwise_xor
import numpy as np
from timeit import Timer
import random
def checksum1(data):
'''Checksum is the bytes XOR'ed together, then bit inverted - truncated to a chr'''
return (~(data[0] ^ data[1] ^ data[2]) & 0xff).to_bytes(1,byteorder='big',signed=False)
@lru_cache(maxsize=128)
def checksum2(data):
'''Checksum is the bytes XOR'ed together, then bit inverted - truncated to a chr'''
return (~(data[0] ^ data[1] ^ data[2]) & 0xff).to_bytes(1,byteorder='big',signed=False)
def checksum3(data):
'''Checksum is the bytes XOR'ed together, then bit inverted - truncated to a chr'''
return bitwise_and(invert(bitwise_xor(bitwise_xor(data[0],data[1]),data[2])),255).astype(np.uint8).tobytes()
@lru_cache(maxsize=128)
def checksum4(data):
'''Checksum is the bytes XOR'ed together, then bit inverted - truncated to a chr'''
return bitwise_and(invert(bitwise_xor(bitwise_xor(data[0],data[1]),data[2])),255).astype(np.uint8).tobytes()
if __name__ == "__main__":
#T = Timer('test()',"from __main__ import test")
T = Timer('checksum1((random.randint(0,127),0,0))',"import random;from __main__ import checksum1")
print(T.timeit())
T = Timer('checksum2((random.randint(0,127),0,0))',"import random;from __main__ import checksum2")
print(T.timeit())
T = Timer('checksum3((random.randint(0,127),0,0))',"import random;from __main__ import checksum3")
print(T.timeit())
T = Timer('checksum4((random.randint(0,127),0,0))',"import random;from __main__ import checksum4")
print(T.timeit())
py test.py
+4,10519769108277
+6,260751157558025
+10,463237500651697
+6,182100842095494
Это подразумевает, что метод NumPy является медленным, и доступ к кэш-памяти lru обеспечивает большую нагрузку, чем он получит.
Я делаю что-то не так или это правильно?