将大字节对象转换为整数列表的更快方法

Faster way to convert a large bytes object into a list of integers

我有一个大字节对象(来自具有大约 800 万个样本的 16 位 WAVE 文件的原始数据),我需要将其转换为整数列表以进行一些处理。到目前为止,我使用列表理解和 int.from_bytes 进行转换,但我注意到它花费了大量时间。我想知道是否有更快的解决方案。

这是我目前的方法:

data = [int.from_bytes(raw[i * sampwidth:((i + 1) * sampwidth)], "little", signed=True) for i in range(len(raw) // sampwidth)]

在我的机器上,这种方法在单个内核上每个文件(我有多个文件)大约需要 9 秒,我想知道我是否正在推动 Python 的限制,或者是否有存在更优的方法。

如果你可以使用 scipy(它有很多其他不错的信号处理函数)你可以使用 scipy.io.wavefile.read

import scipy.io.wavfile
rate, data_np_ary = scipy.io.wavfile.read('example.wav')

看来 NumPy 确实是个不错的选择。它成功地在一秒钟多一点的时间内加载了所有 12 个 WAVE 文件(并进行了简单的立体声到单声道的转换)。代码也更优雅。这种方法唯一的缺点是它只支持 1、2、4 和 8 字节整数,但由于我处理的是音频数据,所以这不会成为问题。

新的 NumPy 解决方案:

data = numpy.frombuffer(raw, numpy.int16)