所以我有一个.wav文件。从这里我得到了数据: 正如预期的声音文件它是立体声所以数据看起来像
[[1,2], [2,3], [4,9], [1,5], [1,7], ....]
注意:我刚刚编写了这些数字,但关键是它是一个嵌套列表。 这里的问题是我正在对此进行FFT,因此我只想使用两个通道的平均值,这样我想要:
[ [1.5], [2.5], [6.5], [3], [4], .... ]
所以我这样做了:
averaged_array = [sum(x)/len(x) for x in original_list]
我假设len(x)是一个恒定时间操作,即使它总是2。
这里的问题是我认为原始列表的长度大于900,000。在我的家用电脑上,我可以在~46秒内平均一次。在我需要用于演示的计算机上需要约121秒。这是一个相当大的增长,坦率地说,它必须在它运行时等待。无论如何,我可以优化它,以便减少它所需的时间吗?
注意:我相信这是一台双核计算机,所以我不能并行运行(我想?)。 我可以ssh到服务器(运行一些i7),我已被允许使用..如果我以某种方式ssh'ed并在那里做计算会更好吗?我正在使用的原始计算机是~2 ghz,但是是一个古老的戴尔模型亲戚(几年前的系列)。此外,迈克菲和另一个进程也占用了大约50%的处理,我没有权利杀死这些进程。
如果我这样做:
答案 0 :(得分:6)
对于这类任务,您确实希望使用事实上的标准NumPy模块。该模块以高效的方式处理大型数组(如果您需要,它甚至可以为您进行FFT)。
以下是你如何做到平均值:
>>> a = numpy.array([[1,2], [2,3], [4,9], [1,5], [1,7]])
>>> numpy.average(a, axis=-1)
array([ 1.5, 2.5, 6.5, 3. , 4. ])
在我的机器上执行100万对数组上的平均值仅需22 ms。
然后可以使用numpy.fft
模块完成FFT。