我试着用python读取几千小时的wav文件并获得它们的持续时间。这基本上需要打开wav文件,获取帧数并将采样率考虑在内。代码如下:def wav_duration(file_name):
wv = wave.open(file_name, 'r')
nframes = wv.getnframes()
samp_rate = wv.getframerate()
duration = nframes / samp_rate
wv.close()
return duration
def build_datum(wav_file):
key = "/".join(wav_file.split('/')[-3:])[:-4]
try:
datum = {"wav_file" : wav_file,
"labels" : all_labels[key],
"duration" : wav_duration(wav_file)}
return datum
except KeyError:
return "key_error"
except:
return "wav_error"
按顺序执行此操作将花费太长时间。我的理解是多线程应该有帮助,因为它本质上是一个IO任务。因此,我这样做:
^{pr2}$
然而,令我沮丧的是,我得到了以下结果(以秒为单位):Num threads | 100k wavs | 1M wavs
1 | 4.5 | 39.5
2 | 6.8 | 54.77
10 | 9.5 | 64.14
100 | 9.07 | 68.55
这是预期的吗?这是CPU密集型任务吗?多处理有帮助吗?我怎样才能加快速度?我正在从本地驱动器读取文件,这是在一个Jupyter笔记本上运行的。Python3.5版。在
编辑:我知道GIL。我只是假设打开和关闭文件本质上是IO。People's analysis已经表明,在IO情况下,使用多个处理可能会适得其反。因此,我决定改用多重处理。在
我想现在的问题是:这个任务是IO绑定的吗?
编辑编辑(EDIT EDIT):对于那些想知道的人来说,我认为这是CPU限制(一个核心的最大值是100%)。这里的教训是不要对任务做假设,自己去检查。在