1

所以我有一个 .wav 文件。从这里我得到了数据:正如预期的声音文件一样,它是立体声的,所以数据看起来像

清单 1(原始清单)

[ [1,2], [2,3], [4,9], [1,5], [1,7], ....]

注意:我只是编造了这些数字,但重点是它是一个嵌套列表。这里的问题是我正在对此进行 FFT,因此我只想使用两个通道的平均值,所以我想要:

清单 2(平均)

[[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 并在那里进行计算会更好吗?我相信我使用的原始计算机约为 2 ghz,但它是旧的戴尔型号(几年前的系列)。此外,McAfee 和另一个进程也占用了大约 50% 的处理时间,我无权终止这些进程。

如果我这样做:

  • 我将如何通过 SSH 在这台远程计算机上进行计算?(我使用的是 python 2.7,并且真的不希望安装任何外部库,因为这不是我的计算机而是组织计算机)
  • 我能以某种“顺序”进行计算吗?我认为在并行执行操作时,您无法维持秩序,因为一旦打开核心来计算它就会完成。按顺序我的意思是:我希望列表将平均值保持在原始列表的相同索引处。前任。[ [1,2], [3,4]] 应该给出 [ [2.5], [3.5]] 而不是 [ [3.5], [2.5]]
4

1 回答 1

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 毫秒。

然后可以使用numpy.fft模块完成 FFT。

于 2012-04-07T00:42:33.797 回答