コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Python】for を並列化する方法

概要

import glob
import librosa
import soundfile
import shutil
import sys
import os

# コマンドライン引数で指定されたディレクトリに存在するすべての .ogg のファイルパスを取得
files = glob.glob(sys.argv[1] + "/*.ogg")

for file in files:
    # .ogg を読み込む
    y, sr = librosa.load(file, sr=None, mono=False)

    # 読み込んだ .ogg の最初と最後に存在する無音区間を削除
    # top_db で無音区間の閾値を調整可能
    yt, index = librosa.effects.trim(y, top_db=30)

    # 無音区間を削除した .ogg を保存
    # data に yt.T ではなく yt を渡すと `Format not recognised.` が発生して保存に失敗するので注意
    # https://github.com/bastibe/python-soundfile/issues/276
    soundfile.write(file=file, data=yt.T, samplerate=sr)

上記のような .ogg の最初と最後に存在する無音区間を削除する Python を
並列化したかった

import glob
import librosa
import soundfile
import shutil
import sys
import os
import concurrent.futures

# コマンドライン引数で指定されたディレクトリに存在するすべての .ogg のファイルパスを取得
files = glob.glob(sys.argv[1] + "/*.ogg")

def process_file(file):
    # .ogg を読み込む
    y, sr = librosa.load(file, sr=None, mono=False)

    # 読み込んだ .ogg の最初と最後に存在する無音区間を削除
    # top_db で無音区間の閾値を調整可能
    yt, index = librosa.effects.trim(y, top_db=30)

    # 無音区間を削除した .ogg を保存
    # data に yt.T ではなく yt を渡すと `Format not recognised.` が発生して保存に失敗するので注意
    # https://github.com/bastibe/python-soundfile/issues/276
    soundfile.write(file=file, data=yt.T, samplerate=sr)

# with 文で ThreadPoolExecutor を使い、各ファイルの処理を並列実行する
with concurrent.futures.ThreadPoolExecutor() as executor:
    futures = [executor.submit(process_file, file) for file in files]

# 各処理の完了を待つ
concurrent.futures.wait(futures)

concurrent.futures モジュールを使用して上記のように書き換えることで並列化できた