【问题标题】:Faster way to convert a large bytes object into a list of integers将大字节对象转换为整数列表的更快方法
【发布时间】:2019-08-29 00:52:15
【问题描述】:

我有一个大字节对象(来自具有大约 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 的限制,或者是否存在更优化的方法。

【问题讨论】:

标签: python python-3.6


【解决方案1】:

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

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

【讨论】:

  • 谢谢。我将看一下 SciPy,尽管我觉得对于我试图解决的简单任务来说这可能有点矫枉过正。尽管如此,我很高兴了解将 WAVE 文件加载到 NumPy 数组中的单个函数解决方案,这似乎是我的性能问题的解决方案。
【解决方案2】:

似乎 NumPy 确实是要走的路。它已成功加载所有 12 个 WAVE 文件(并进行简单的立体声到单声道转换)。代码也更优雅。这种方法唯一的缺点是它只支持1、2、4和8字节的整数,但是由于我是在处理音频数据,所以这不是问题。

新的 NumPy 解决方案:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 2016-01-31
    • 2017-01-27
    • 2014-10-17
    • 1970-01-01
    相关资源
    最近更新 更多