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