Joblibを使用してPythonコードを並列に実行

4394 ワード

微信公衆番号:測定空間
ほとんどの問題では、並列計算は計算速度を向上させることができます.PCの計算能力が向上するにつれて,PCでパラレルコードを実行することで計算速度を簡単に向上させることができる.Joblibは、Pythonコードを単純にパラレルコンピューティングモードに変換できるパッケージで、私たちのプログラムを非常に単純にパラレル化し、コンピューティング速度を向上させることができます.
JoblibはPythonで軽量レベルのパイプラインを提供するためのツールのセットです.次の機能があります.
  • 透明なディスクキャッシュ機能と「怠惰」実行モード、簡単な並列計算
  • Joblibはnumpy大型配列を特定の最適化し,簡単で,迅速であった.

  • 以下では,Joblibを用いて並列計算を実現する方法を簡単な例を用いて説明する.単一パラメータiを用いて簡単な関数my_fun()を定義した.この関数は1秒待機し、i**2の平方根、すなわちi自体を返します.
    from joblib import Parallel, delayed
    import time, math
    
    def my_fun(i):
        """ We define a simple function here.
        """
        time.sleep(1)
        return math.sqrt(i**2)
    
    

    ここでは、全反復回数を10に設定.time.time()関数を使用して、my_fun()の実行時間を計算します.簡単なforサイクルを使用すると、計算時間は約10秒です.
    num = 10
    start = time.time()
    for i in range(num):
        my_fun(i)
        
    end = time.time()
    
    print('{:.4f} s'.format(end-start))
    
    10.0387 s
    

    JoblibのParallelおよびdelayed関数を使用して、my_fun()関数の並列動作を簡単に構成できます.ここではいくつかのパラメータを使用します.n_jobsはパラレルジョブの数です.ここでは2に設定します.imy_fun()関数の入力パラメータであり、依然として10反復である.2つのパラレルタスクは、forサイクルの実行時間の約半分を節約し、結果としてパラレルに約5秒かかります.
    start = time.time()
    # n_jobs is the number of parallel jobs
    Parallel(n_jobs=2)(delayed(my_fun)(i) for i in range(num))
    end = time.time()
    print('{:.4f} s'.format(end-start))
    
    5.6560 s
    

    こんなに簡単です!もし私たちの関数に複数のパラメータがあったらどうしますか?簡単です.2つのパラメータを使用して、新しい関数my_fun_2p(i,j)を定義します.
    def my_fun_2p(i, j):
        """ We define a simple function with two parameters.
        """
        time.sleep(1)
        return math.sqrt(i**j)
    
    j_num = 3
    num = 10
    start = time.time()
    for i in range(num):
        for j in range(j_num):
            my_fun_2p(i, j)
        
    end = time.time()
    print('{:.4f} s'.format(end-start))
    
    30.0778 s
    
    start = time.time()
    # n_jobs is the number of parallel jobs
    Parallel(n_jobs=2)(delayed(my_fun_2p)(i, j) for i in range(num) for j in range(j_num))
    end = time.time()
    print('{:.4f} s'.format(end-start))
    
    15.0622 s
    

    並列計算機能に加えて、Joblibには次の機能があります.
  • 高速ディスクキャッシュ:Python関数のmemoizeまたはmake-like機能.大型numpy配列を含む任意のPythonオブジェクトに適用されます.
  • 高速圧縮:pickleの代わりにjoblibを使用する.dumpとjoblib.loadはビッグデータの読み取りと記憶効率を向上させることができる.

  • 詳細については、Joblibの公式サイトを参照してください.
    転載先:https://juejin.im/post/5cd24136518825408b33e5dc