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以外を検討してみたほうが良いかもしれません。

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

PostGISインストール手順

QGIS3でPostGISを使うことを目標に設定をしてみましたので紹介します。


PostgreSQLをダウンロードする

インストーラーをダウンロードする

f:id:Chiakikun:20190723232529p:plain

https://www.postgresql.org/download/windows/』にアクセスして、お使いの環境に合ったPostgreSQLのバージョンを確認して、上の赤丸のダウンロードサイトに移動します。私はWindows 10を使っているので、下の赤丸で囲ったVersion 10をダウンロードします。

 

f:id:Chiakikun:20190723233145p:plain

移動先のページで、version 10のインストーラーをダウンロードします。

 


PostgreSQLをインストールする

インストーラーを実行する

f:id:Chiakikun:20190723233551p:plain

f:id:Chiakikun:20190723233513p:plain

ダウンロードしたインストーラーを実行します。インストール先はデフォルトのままにしました。

 

コンポーネントを選択する

f:id:Chiakikun:20190723233740p:plain

インストールするコンポーネントを選択します。今回は全部インストールします。

 

データディレクトリを指定する

f:id:Chiakikun:20190723234441p:plain

データディレクトリを指定します。このフォルダにデータベースが作成されるので、ディスクの空き容量に注意してください。後で変更することもできます。

 

パスワードを設定する

f:id:Chiakikun:20190723235717p:plain

データベース管理者用のパスワードを設定します。

 

ポート番号を設定する

f:id:Chiakikun:20190723235812p:plain

接続を待ち受けるポート番号を設定します。

 

ロケールを設定する

f:id:Chiakikun:20190723235957p:plain

ロケールを設定します。私は「C」を指定しましたが、こちらのサイト『

ロケール(国際化と地域化) | Let's Postgres』を参考に、自分の使い方に合うロケールを設定してください。

ロケール設定後、いくつかダイアログ操作がありますが、Nextボタンを押下するだけなので、省略します。


PostGISをインストールする

f:id:Chiakikun:20190727224652p:plain

PostgreSQLのインストールに続いてStackBuilderでPostGISをインストールします。

 

StackBuilderを実行する

f:id:Chiakikun:20190727232839p:plain

インストールしたPostgreSQLを選択して、『次へ』ボタンを押下します。

 

インストールするPostGISのバージョンを選択する

f:id:Chiakikun:20190727233009p:plain

『Spatial Extensions』からPostGISを選択します。私は一番下を選択しました。

 

PostGISインストーラーをダウンロードする

f:id:Chiakikun:20190727233148p:plain

PostGISのパッケージのダウンロード先を指定して、『次へ』ボタンを押下します。

 

インストーラーを実行する

f:id:Chiakikun:20190727233251p:plain

ダウンロードが完了したらインストーラーを実行します。

 

f:id:Chiakikun:20190727233403p:plain

今回はPostGISのデータベースを作成するオプションにチェックを入れます。

 

インストール先を指定する

f:id:Chiakikun:20190727233554p:plain

インストール先を指定します。

 

サーバーに接続する

f:id:Chiakikun:20190727233648p:plain

PostGISデータベースの作成先のサーバーの管理者の名前とパスワードを入力します。

こちらで入力した文字列です。

 

PostGISのデータベース名を設定する

f:id:Chiakikun:20190727234028p:plain

作成するPostGISのデータベース名を入力します。この後、環境設定のダイアログがいくつか表示されます。

 

f:id:Chiakikun:20190728141819p:plain

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


環境変数の設定

f:id:Chiakikun:20190728142230p:plain

コマンドラインツールを使えるように、環境変数のPathを設定します。PowerShellで下記のコードを実行します。

    $oldSystemPath = [System.Environment]::GetEnvironmentVariable("Path", "User")
    $oldSystemPath += ";C:\Program Files\PostgreSQL\10\bin"
    [System.Environment]::SetEnvironmentVariable("Path", $oldSystemPath, "User")

f:id:Chiakikun:20190728225404p:plain

PowerShellを再起動して「psql -v」と入力して実行してみてください。上の画像のようになりましたか?

シェープファイルを取り込んでみる

Shapefile and DBF Loaderを起動する

f:id:Chiakikun:20190729234418p:plain

「PostGis 2.0 Shapefile and DBF Loader Exporter」を起動します。スタートボタンを押してshpと入力して検索すると、すぐ出てくると思います。

 

サーバーに接続する

f:id:Chiakikun:20190730231600p:plain

赤丸部分のボタンを押して、サーバーに接続します。

 

f:id:Chiakikun:20190730231731p:plain

ダイアログが表示されます。Usernameには「postgres」、

Databaseには、こちらで設定したデータベース名(postgis_25_sample)を入力します。Passwordにはこちらで入力した文字列を入力します。

 

f:id:Chiakikun:20190730232614p:plain

接続に成功すると、上のようなメッセージが表示されます。

 

シェープファイルを選択する

f:id:Chiakikun:20190730232658p:plain

接続したデータベースにインポートするシェープファイルを選択します。赤丸部分のボタンを押下すると、ファイル選択のダイアログが表示されるので、シェープファイルを選択します。

 

SRIDを設定する

f:id:Chiakikun:20190730232825p:plain

選択したファイルがリストに追加されます。SRIDには、選択したシェープの空間参照系のコードを入力します。

 

インポートできた?

f:id:Chiakikun:20190730233842p:plain

インポートに成功すると、上のようなメッセージが表示されます。

 

QGISで開いてみる

f:id:Chiakikun:20190730233934p:plain

QGISで表示してみます。ブラウザの「PostGIS」のメニューから、「新しい接続」を選択します。

f:id:Chiakikun:20190730234150p:plain

名前は適当でいいです。ホストにはPostGISをインストールしたPCのアドレス(他のPCにインストールしたのでなければlocalhostと入力してください)、データベースには先ほどシェープファイルをインポートしたデータベース名を入力します。下の赤で囲った部分は必要に応じてチェックしますが、今回はQGISで表示するだけなので、何もチェックしないでいいです。

 

f:id:Chiakikun:20190730234129p:plain

設定ができたら接続してみます。

 

f:id:Chiakikun:20190730234956p:plain

ダイアログが表示されるので、シェープファイルをインポートするときに入力したユーザー名とパスワードを入力します。

 

f:id:Chiakikun:20190730235207p:plain

接続に成功すると、先ほどインポートしたファイル名がpublicの下に表示されていると思います。ダブルクリックしてみると...

 

f:id:Chiakikun:20190730235353p:plain

インポートしたシェープファイルがマップに表示されます。お疲れさまでした。

numpy-quaternionを使ってみる

Python四元数を使う方法について調べていたところ、numpy-quaternion · PyPIに辿り着きました。このページでは、numpy-quaternionのインストール方法について紹介していきます。


インストール

pipを実行する

f:id:Chiakikun:20181006181543p:plain

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

pip install numpy-quaternion

使ってみる

インストールできたら、以下のコードを保存してPythonで実行してみます。

import numpy as np
import quaternion

q1 = np.quaternion(1,2,3,4)
q2 = np.quaternion(5,6,7,8)
print("q1 * q2 ", q1 * q2)

「Coult not import from numba」と警告が出たら...

f:id:Chiakikun:20181006181855p:plain

使ってみると、こんな警告が表示されました。どうやらnumbaというものをインストールしたほうがいいよってことだそうなので...

numbaをインストールする

f:id:Chiakikun:20181006182134p:plain

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

pip install numba

 

f:id:Chiakikun:20181006182216p:plain

先ほどのソースコードの3行目に次のコードを追加して実行してみます。すると、今度は警告が出なくなりました。

import numba

numpy-quaternionの使い方

下記のページのUsageには、numpy-quaternionの使い方が幾つかのサンプルで紹介されていますので、ご覧になってみてください。

github.com

ありがとうございました