Pythonのプロファイリング「cProfile」を使って、ざっくり関数レベルでどの関数でどれぐらい実行時間がかかっているかを調べます。

  1. 実行時間を計測するプログラム「TestTimeMeasurement.py」を次に示します。matplotlibライブラリを使ったグラフ表示プログラムとなります。
  2. TestTimeMeasurement.py

    import numpy as np
    import matplotlib.pyplot as plt
    import time
    
    
    def createdata():
        x = np.linspace(-np.pi, np.pi, num=100, endpoint=True)
        y1 = np.sin(x)
        y2 = np.sin(x * 2)
        y3 = np.cos(x * 2)
        return x, y1, y2, y3
    
    
    def configgraph():
        fig = plt.figure()
        ax1 = plt.axes([0.1, 0.3, 0.8, 0.6])
        ax2 = plt.axes([0.1, 0.1, 0.8, 0.2])
        ax3 = plt.axes([0.55, 0.35, 0.3, 0.2])
        return ax1, ax2, ax3
    
    
    def drowgraph(ax1, ax2, ax3, x, y1, y2, y3):
        ax1.set_ylim(-1, 1)
        ax2.set_ylim(-1, 1)
    
        ax1.tick_params(labelbottom=False)
        ax2.tick_params(labelleft=False)
    
        ax3.set_title("cos 2x curve")
    
        ax1.plot(x, y1)
        ax2.plot(x, y2)
        ax3.plot(x, y3)
    
    
    def showgraph():
        #plt.show()
        plt.pause(0.001)
    
    
    def main():
        x, y1, y2, y3 = createdata()
        ax1, ax2, ax3 = configgraph()
        drowgraph(ax1, ax2, ax3, x, y1, y2, y3)
        showgraph()
    
    
    if __name__ == "__main__":
        start = time.time()
        main()
        elapsed_time = time.time() - start
        print("elapsed_time:{0}".format(elapsed_time) + "[sec]")
    
    
  3. 次のように実行します。main関数の実行時間が「1.0252997875213623[sec]」と表示されます。
  4. $ python3 TestTimeMeasurement.py
    elapsed_time:1.0252997875213623[sec]
    
  5. 次のように「 -m cProfile」を指定して実行します。
  6. $ sudo python3 -m cProfile TestTimeMeasurement.py > time-measurement-web
    

    リダイレクトされたファイル「time-measurement-web」を開くと次のように表示されます。

    elapsed_time:1.629910945892334[sec]
             1079732 function calls (1052970 primitive calls) in 4.106 seconds
    
       Ordered by: standard name
    
       ncalls  tottime  percall  cumtime  percall filename:lineno(function)
               ...
            1    0.000    0.000    4.110    4.110 TestTimeMeasurement.py:1()
            1    0.000    0.000    0.676    0.676 TestTimeMeasurement.py:14(configgraph)
            1    0.000    0.000    0.034    0.034 TestTimeMeasurement.py:22(drowgraph)
            1    0.000    0.000    0.919    0.919 TestTimeMeasurement.py:36(showgraph)
            1    0.000    0.000    1.630    1.630 TestTimeMeasurement.py:41(main)
            1    0.000    0.000    0.001    0.001 TestTimeMeasurement.py:6(createdata)
               ...
    
               ※時間の単位:秒
    
    1行目
    呼び出した関数の数と実行時間
    Ordered by
    出力のソート方法
    ncalls
    呼び出し回数
    tottime
    subfunctionの実行時間を除いた時間
    percall
    tottimeをncallsで割った値
    cumtime
    この関数とそのsubfuntionに消費された累積時間
    percall
    cumtimeを呼び出し回数で割った値。関数単位の実行時間
  7. time ライブラリでの実行時間を使って、cProfileで計測した実行時間を補正して各関数ごとの実行時間を計算すると、次のようになりました。