NumbaでPythonプログラム高速化

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

インストール

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秒でした。

仕方ないけど、やはりPythonは遅い

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

f:id:Chiakikun:20190825164702p:plain

QGISの機能で傾斜方位を算出すると、なんと約1秒でした。

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

C# + gdal_csharpで同じプログラムを作ってみたのですが、やはり1秒程で処理が終わります。

どうしてもPythonを使いたい + Numbaをインストールできる環境の方は、Numbaを試してみてください。特に拘りが無い方は、他の言語の使用を検討した方が良いと思います。

 

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