Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python本机按位与按位之间的速度比较;努比_Python_Numpy_Timeit - Fatal编程技术网

python本机按位与按位之间的速度比较;努比

python本机按位与按位之间的速度比较;努比,python,numpy,timeit,Python,Numpy,Timeit,我有一些代码,在这些代码中,我需要计算一个校验和(在传输和接收数据之前)。在做一个简单的定时检查时,我们花费了相当长的时间来计算和检查它。处理210000个数据包是有意义的 浏览一些站点(因此弹出了几次)时,numpy bitwise比native()出现得更快 同样,我也研究了lru_缓存,因为我可以在大多数情况下接受非常类似的请求 我试过这个,得到了一些奇怪的结果 !/usr/bin/env python #-*- coding: utf-8 -*- from functools impo

我有一些代码,在这些代码中,我需要计算一个校验和(在传输和接收数据之前)。在做一个简单的定时检查时,我们花费了相当长的时间来计算和检查它。处理210000个数据包是有意义的

浏览一些站点(因此弹出了几次)时,numpy bitwise比native()出现得更快

同样,我也研究了lru_缓存,因为我可以在大多数情况下接受非常类似的请求

我试过这个,得到了一些奇怪的结果

!/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.26075115558025

10.463237500651697

6.182100842095494

这意味着numpy方法很慢&访问lru缓存提供的开销比它获得的开销要大


我做错了什么,还是这是正确的

一般来说,我建议您只生成一个随机整数,可以肯定的是,这不会影响您的结果。您只将单值参数传递给numpy,因此可能会降低性能,因为它们需要首先转换为数组。谢谢。我使用了一个rnd,这样lru缓存可以做一些工作。将其设置为固定会产生更快的时间(无rnd调用),但有类似的差异。原始py赢(1.69),np+lru赢(3.98),py+lru赢(4.06),原始np赢(8.40)。看来我已经做得很好了。Thanks@kazemakase是正确的-要正确利用numpy函数的效率,您需要将它们应用于整个阵列,而不是单个元素。如果
data
是一个numpy数组,那么
np.bitwise\u和(data,b)
data&b
之间不会有明显的性能差异,因为
&
np.bitwise\u和
都将调用数组的
\u和
方法(同样适用于
^
等)。