Python 取代字节数组处理瓶颈的高速替代方案

Python 取代字节数组处理瓶颈的高速替代方案,python,arrays,numpy,Python,Arrays,Numpy,>请参见下面的编辑有几个地方可以显著加快速度。也许最明显的是重写GetFrame: def GetFrame(ProcessedMatrix): if ProcessedMatrix.shape == (3584, 32): return np.unpackbits(ProcessedMatrix[13::14]).reshape(256, 256) return False 这要求ProcessedMatrix是np.uint8类型的ndarray,但除此之外

>请参见下面的编辑有几个地方可以显著加快速度。也许最明显的是重写
GetFrame

def GetFrame(ProcessedMatrix):
    if ProcessedMatrix.shape == (3584, 32):
        return np.unpackbits(ProcessedMatrix[13::14]).reshape(256, 256)
    return False
这要求
ProcessedMatrix
np.uint8
类型的
ndarray
,但除此之外,在我的系统上,它的运行速度要快1000倍

对于其他两个函数,我认为在
ReadStream
中应该执行以下操作:

def ReadStream(RXcount):
    global ftdi
    return np.frombuffer(ftdi.read(RXcount), dtype=np.uint8)
即使它不能大大加快该函数的速度,因为读取占用了大部分时间,但它已经为您提供了一个numpy字节数组。这样,您就可以继续
ProcessRawData
并尝试:

def ProcessRawData(RawData):
    if len(RawData) == 114733:
        return RawData[1:-44].reshape(-1, 32)
    return None

比您的版本快10倍。

ftdi.read(RXcount)需要多长时间?您可以<代码>返回BytErrar(RxDATA)< /C>而不是几乎没有时间的列表。在我的系统(相当快)中,将1 MB字节串转换为<代码>列表<代码>需要13毫秒。您应该把它作为字节串,NUMPY可以处理它。Python、C++和C标记,但只显示Python代码…请按预期使用标签。当然,你提到如果需要,你准备使用C语言,但你承认从未使用过这种语言。。。哦,除此之外:如果你编写标准C,那么它可以在所有平台上编译,这就是C的含义。我还怀疑你构建
RowData
的方式非常(非常)慢。通过双嵌套的
循环中的
+
进行字符串连接。。。是的,这可以大大加快。@gnibbler,我改为
bytearray(RXdata)
,它只将
ReadStream
函数时间提高了0.001秒(现在是0.036秒)。不过,每一点都有帮助。是的,@roippi看着
RowData
,这肯定是可疑的。。嗯,我要看看怎样才能改进它。太棒了!现在非常优雅,我现在得到8帧/秒(三个函数的总执行时间现在下降到0.12秒)。这是一个非常棒的函数!让我们看看是否还有其他人需要添加任何内容,以便用其他内容从中挤出更多帧。我真的很感谢你的帮助和对细节的关注-谢谢!
def ReadStream(RXcount):
    global ftdi
    return np.frombuffer(ftdi.read(RXcount), dtype=np.uint8)
def ProcessRawData(RawData):
    if len(RawData) == 114733:
        return RawData[1:-44].reshape(-1, 32)
    return None
def GetFrame(ProcessedMatrix):
    if ProcessedMatrix.shape == (3584, 32):
        return np.unpackbits(ProcessedMatrix[13::14]).reshape(256, 256)
    return False
def GetFrame(ProcessedMatrix):
    if ProcessedMatrix.shape == (3584, 32):
        return np.unpackbits(ProcessedMatrix[13::14]).reshape(256, 256)
    return False
def ReadStream(RXcount):
    global ftdi
    return np.frombuffer(ftdi.read(RXcount), dtype=np.uint8)
def ProcessRawData(RawData):
    if len(RawData) == 114733:
        return RawData[1:-44].reshape(-1, 32)
    return None