NumbaでPythonプログラム高速化

幌延地域を対象とした10mグリッド数値標高モデルを用いた精密地形解析図の作成』を参考に、標高数値モデルから斜面方位図を作成するためのプログラムをPythonで作成したのですが、あまりにも実行速度が遅かったので、プログラムの実行速度を改善するためにNumbaというライブラリを使用し、高速化できました。Numbaについては

Pythonのnumpyで四元数してみたでも少しだけ触れたのですが、もう一度紹介します。

インストール

f:id:Chiakikun:20190825152553p:plain

管理者権限でPowershellを起動して、次のコマンドを実行します。

pip install numba

インストールはこれで終わりです。

プログラムにNumbaを適用する

①例えば、下記のコードの赤字の関数を高速化するには...

        for y in range(1, nrow - 1) :
            for x in range(1, ncol - 1) :
                if dem_check4(self.__dem, x, y, self.__nodata) == False: continue
                if x == 1:
                    dx, dy = self.__dxdy(grs80, x, y)
                dem_hoi(self.__dem, x, y, dx, dy, result)

②numbaをインポートします

# -*- coding: utf-8 -*-
import numpy as np 
import numba
....

③各関数の先頭に『@numba.jit』を記述します

@numba.jit
def dem_check4(dem, x, y, nodata):
    if dem[y][x-1]   == nodata: return False
    if dem[y][x+1]   == nodata: return False
    ....
    
@numba.jit
def dem_hoi(dem, x, y, dx, dy, result):
    Hx = (dem[y-1][x-1] + dem[y][x-1] + dem[y+1][x-1] - (dem[y-1][x+1] + dem[y][x+1] + dem[y+1][x+1])) / (3 * dx)
    Hy = (dem[y+1][x-1] + dem[y+1][x] + dem[y+1][x+1] - (dem[y-1][x-1] + dem[y-1][x] + dem[y-1][x+1])) / (3 * dy)
    ....

numbaを使ってみた結果

f:id:Chiakikun:20190825163755p:plain

f:id:Chiakikun:20190825164007p:plain

①今回は富士山周辺の数値標高モデルの斜面方位を作成しました。

numba適用前の実行時間は350秒でした。

numba適用後の実行時間は19秒でした。

ものすごく速くなったなぁと感じたのですが...

f:id:Chiakikun:20190825164702p:plain

QGISの傾斜方位を実行すると、1秒でした。

私のプログラムに何か問題があるのかもしれません...。

C# + gdal_csharpで同じプログラムを作ってみたのですが、結果は1秒切る実行速度でした。どうしても速度が必要な場合はPython以外を検討してみたほうが良いかもしれません。

最後までご覧頂き、ありがとうございました