Сравнение скорости между питоном родным поразрядно

У меня есть некоторый код, и в этом коде мне нужно вычислить контрольную сумму (перед передачей и на полученных данных). При простой проверке времени был потрачен сравнительно большой промежуток времени на его вычисление и проверку. Имея в своем распоряжении 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 обеспечивает большую нагрузку, чем он получит.

Я делаю что-то не так или это правильно?

0 ответов

Другие вопросы по тегам