>>请参见下面的编辑我正在通过pyUSB使用FTDI D2xx驱动程序通过串行处理来自特殊像素CCD相机的数据。相机可以在PC上以高达80帧/秒的高带宽运行。我很喜欢这种速度,但是我知道使用Python是不可行的,因为它是一种脚本语言,但是我想知道我能达到的程度-无论是我在代码中错过的一些优化,线程,或使用其他方法。我立即想到打破最耗时的循环并将其放入C代码中,但是我对C代码没有太多的经验,并且不确定如果可能的话让Python与之进行内联的最佳方法。我有使用SciPy/Numpy在Python中大量开发的复杂算法,这些算法已经过优化并具有可接受的性能,因此,如果那是最好的方法,我将需要一种方法来加快数据获取速度以反馈给Python 。困难以及我使用Python(而不是其他语言)的原因是因为需要能够轻松地跨平台运行它(我在Windows中进行开发,但是将代码放在嵌入式Linux板上,独立系统)。如果您建议我使用其他代码,例如C,那么我将如何跨平台工作?我从来没有在Windows和Linux之间编译像C这样的低级语言,所以我想确定该过程-我必须为每个系统编译它,对吗?你有什么建议?这是我的函数,具有当前执行时间: ReadStream:读取设备时的'RXcount'为114733,格式从字符串到字节等效返回字节列表(0-255),代表二进制值 当前执行时间:0.037秒def ReadStream(RXcount): global ftdi RXdata = ftdi.read(RXcount) RXdata = list(struct.unpack(str(len(RXdata)) + 'B', RXdata)) return RXdata ProcessRawData:将字节列表重塑为与像素方向匹配的数组修剪掉一些不需要的字节后,结果为3584x32数组。数据是唯一的,因为14行的每个块代表设备上一行像素的14位(32位@ 8位/字节= 256位),即256x256像素。处理后的数组有32列字节,因为每个字节以二进制表示8个像素(32字节* 8位= 256像素)。仍在研究如何做到这一点... I have already posted a question for that previously 当前执行时间:0.01秒...不错,只是Numpy def ProcessRawData(RawData): if len(RawData) == 114733: ProcessedMatrix = np.ndarray((1, 114733), dtype=int) np.copyto(ProcessedMatrix, RawData) ProcessedMatrix = ProcessedMatrix[:, 1:-44] ProcessedMatrix = np.reshape(ProcessedMatrix, (-1, 32)) return ProcessedMatrix else: return None最后, GetFrame:设备具有一种模式,它使用阵列的最低位(每14行)仅输出像素是否检测到任何东西-获取该数据并为每个像素转换为int每处理第14行后,结果为256x256数组,这些字节将被读取为二进制字节(32字节... 32字节* 8位= 256像素) 当前执行时间:0.04秒def GetFrame(ProcessedMatrix): if np.shape(ProcessedMatrix) == (3584, 32): FrameArray = np.zeros((256, 256), dtype='B') DataRows = ProcessedMatrix[13::14] for i in range(256): RowData = "" for j in range(32): RowData = RowData + "{:08b}".format(DataRows[i, j]) FrameArray[i] = [int(RowData[b:b+1], 2) for b in range(256)] return FrameArray else: return False 目标:无论您提出什么建议,我都希望将总执行时间定为〜0.02秒/帧(目前0.25秒/帧,而GetFrame函数是最弱的)。设备I/O不是限制因素,因为它每0.0125秒输出一个数据包。如果我减少了执行时间,那么是否可以与某些线程并行运行获取和处理?让我知道您的建议是最好的前进方向-谢谢您的帮助! 编辑,感谢@Jaime:现在的功能是:def ReadStream(RXcount): global ftdi return np.frombuffer(ftdi.read(RXcount), dtype=np.uint8)...时间0.013秒def ProcessRawData(RawData): if len(RawData) == 114733: return RawData[1:-44].reshape(-1, 32) return None...时间0.000007秒!def GetFrame(ProcessedMatrix): if ProcessedMatrix.shape == (3584, 32): return np.unpackbits(ProcessedMatrix[13::14]).reshape(256, 256) return False...时间0.00006秒!因此,使用纯Python,我现在能够以所需的帧速率获取数据!在对D2xx USB缓冲区和延迟时间进行了一些调整之后,我将其时钟设置为 47.6 FPS! 最后一步是是否有任何方法可以使其与我的处理算法并行运行?需要某种方式将GetFrame的结果传递给另一个并行运行的循环。 最佳答案 您可以在几个地方显着加快速度。也许最明显的是重写GetFrame:def GetFrame(ProcessedMatrix): if ProcessedMatrix.shape == (3584, 32): return np.unpackbits(ProcessedMatrix[13::14]).reshape(256, 256) return False这就要求ProcessedMatrix是ndarray类型的np.uint8,但是除此之外,在我的系统上,它的运行速度要快1000倍。使用您的其他两个功能,我认为在ReadStream中,您应该执行以下操作:def ReadStream(RXcount): global ftdi return np.frombuffer(ftdi.read(RXcount), dtype=np.uint8)即使它并不能大大加快该功能的速度,因为它大部分时间都是在读取数据,所以它已经为您提供了一个工作的字节数组。这样,您就可以继续ProcessRawData并尝试:def ProcessRawData(RawData): if len(RawData) == 114733: return RawData[1:-44].reshape(-1, 32) return None比您的版本快10倍。关于python - 替代字节数组处理瓶颈的高速替代品,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23528107/
10-11 19:19