python - 大型阵列的优化平均?

标签 python average

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

列表 1(原始列表)

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

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

列表 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]]

最佳答案

对于这种任务,你真的很想使用事实上的标准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。

关于python - 大型阵列的优化平均?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10050695/

相关文章:

python - 如何在 python 中替换 word docx 中的整个 xml 元素,就好像它们是字符串一样

python - 将列表的元素集成到列表的列表中

python - 检查随机生成的数组中是否存在值

python - 通过 python Pytest 从一个 test.py 文件运行多个测试文件

c++, 'avg = sum/5' 给了我垃圾值,但写 avg = sum/2 给出了工作,我不知道为什么

javascript - 查找数组中字符串的平均字符串长度 - Javascript

python - 滚动时更改滚动窗口大小

python - 分组和平均 NumPy 矩阵

python - Geopy 错误和超时

python - 计算多个日期之间的平均天数