【发布时间】:2016-05-03 14:28:16
【问题描述】:
我使用以下代码进行一些即时声音处理/分析。它有效,但真的很慢(与计划的速度相比)。我添加了一些时间标记来找出问题出在哪里,据他们说不应该有任何问题。所有三个计算时间的典型持续时间(见下文)
编辑:请注意,时间测量在这里并不是真正的问题。为了证明这一点:MyPeaks 基本上只是找到了相当短的 FFT 的最大值——并不昂贵。即使这些例程被注释掉,问题仍然存在。
- 我应该使用不同于 lambda 函数的东西来创建循环吗?
- 我在启动和录制流时是否犯了一些错误?
-
等等
import pyaudio import struct import mute_alsa import time import numpy as np from Tkinter import * def snd_process(k=0): if k<1000: t0=time.clock() data = stream.read(CHUNK) t1=time.clock() fl=CHUNK int_data = struct.unpack("%sh" %str(fl),data) ft=np.fft.fft(int_data) ft=np.fft.fftshift(ft) ft=np.abs(ft) t2=time.clock() pks=MyPeaks(np.log(ft)) freq_out.configure(text=str(pks)) t3=time.clock() print t1-t0, t2-t1, t3-t2 master.after(1, lambda: snd_process(k+1)) CHUNK = 8000 FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 4000 p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) #Tkinter stuff master=Tk() button_play=Button(master, command=snd_process, bg="yellow", text="Analyze") button_play.grid(row=0, column=0) freq_out = Label(master) freq_out.grid(row=0, column=1) freq_out.configure(text='base') mainloop()
【问题讨论】:
-
使用 C 加速你的 python! (或 cython)
-
你怎么知道时间是处理时间而不是master.after()?当我尝试对原始 C 进行 numpy 时,它似乎要快得多。 (对于不足为奇的点)
-
@paddyg 我没有,但这不是问题(见编辑)。
-
如果您每毫秒运行一个函数,并且执行 1000 次,则整个处理必须至少需要一秒钟,加上执行实际工作所需的时间。
标签: python performance python-2.7 pyaudio