我编写了一个类似于 shazam 应用程序的 python 脚本。它捕获 15 秒的音频,然后尝试猜测它对应于数据库中的哪首歌。我已经将我们的歌曲数据库(一个字典字典,其中每个键代表歌曲名称)存储为一个 pickle 文件,称之为 song_db.p,因为创建数据库实际上需要几个小时,大约 100 首歌曲。当我运行我的“Shazam 应用程序”时,这些是步骤:
- 当用户希望开始记录 15 秒样本时,他按下回车键。
- 完成后,我解开我的数据库。
- 然后我调用一个guess_song 函数来尝试猜测这首歌。
第 2 步大约需要 45 秒才能完成。不是很好!我想做的是在用户运行程序或在录制的同时开始解压我的数据库(至少会节省 15 秒,因为这是录制长度),因为两者是独立的。我如何在后台进程中运行 unpickling 函数,该进程将与录制歌曲以及我的 main 函数中的任何函数一起运行,但我不想在 unpickling 完成之前调用guess_song。
这是我编写的代码,它使我得到了大约 5-10 秒的提升,但我与录制并行运行(不是真正在后台)。我想我肯定能做得比这更好。
from multiprocessing import Process
def run_in_parallel(*fns):
proc = []
for fn in fns:
p = Process(target=fn)
p.start()
proc.append(p)
for p in proc:
p.join()
我在我的主要功能中将其称为:
run_in_parallel(recording_file = record_song(), song_db = get_db())
其中 record_song() 是不言自明的,而 get_db 执行数据库的 unpickling。