NumbaでPythonプログラム高速化
『幌延地域を対象とした10mグリッド数値標高モデルを用いた精密地形解析図の作成』を参考に、DEMから斜面方位を算出するためのプログラムをPythonで作成していたのですが、素のままのPythonでは実行速度はかなり遅かったです。
Pythonの実行速度改善方法はいくつかありますが、今回は『Numba』というライブラリを使用して、実際に高速化できたので紹介させていただきます。
インストール
管理者権限で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を使ってみた結果
①どのくらい速くなったのか、試しに富士山周辺の斜面方位図を作成しました。
numba適用前の実行時間は350秒でした。
numba適用後の実行時間は19秒でした。
仕方ないけど、やはりPythonは遅い
ものすごく速くなったなぁと感じたのですが...
②QGISの機能で傾斜方位を算出すると、なんと約1秒でした。
私のプログラムに何か問題があるのかもしれません...。
C# + gdal_csharpで同じプログラムを作ってみたのですが、やはり1秒程で処理が終わります。
どうしてもPythonを使いたい + Numbaをインストールできる環境の方は、Numbaを試してみてください。特に拘りが無い方は、他の言語の使用を検討した方が良いと思います。
最後までご覧頂き、ありがとうございました
PostGISインストール手順
QGIS3でPostGISを使うことを目標に設定をしてみましたので紹介します。
PostgreSQLをダウンロードする
インストーラーをダウンロードする
『https://www.postgresql.org/download/windows/』にアクセスして、お使いの環境に合ったPostgreSQLのバージョンを確認して、上の赤丸のダウンロードサイトに移動します。私はWindows 10を使っているので、下の赤丸で囲ったVersion 10をダウンロードします。
移動先のページで、version 10のインストーラーをダウンロードします。
PostgreSQLをインストールする
インストーラーを実行する
ダウンロードしたインストーラーを実行します。インストール先はデフォルトのままにしました。
コンポーネントを選択する
インストールするコンポーネントを選択します。今回は全部インストールします。
データディレクトリを指定する
データディレクトリを指定します。このフォルダにデータベースが作成されるので、ディスクの空き容量に注意してください。後で変更することもできます。
パスワードを設定する
データベース管理者用のパスワードを設定します。
ポート番号を設定する
接続を待ち受けるポート番号を設定します。
ロケールを設定する
ロケールを設定します。私は「C」を指定しましたが、こちらのサイト『
ロケール(国際化と地域化) | Let's Postgres』を参考に、自分の使い方に合うロケールを設定してください。
ロケール設定後、いくつかダイアログ操作がありますが、Nextボタンを押下するだけなので、省略します。
PostGISをインストールする
PostgreSQLのインストールに続いてStackBuilderでPostGISをインストールします。
StackBuilderを実行する
インストールしたPostgreSQLを選択して、『次へ』ボタンを押下します。
インストールするPostGISのバージョンを選択する
『Spatial Extensions』からPostGISを選択します。私は一番下を選択しました。
PostGISのインストーラーをダウンロードする
PostGISのパッケージのダウンロード先を指定して、『次へ』ボタンを押下します。
インストーラーを実行する
ダウンロードが完了したらインストーラーを実行します。
今回はPostGISのデータベースを作成するオプションにチェックを入れます。
インストール先を指定する
インストール先を指定します。
サーバーに接続する
PostGISデータベースの作成先のサーバーの管理者の名前とパスワードを入力します。
こちらで入力した文字列です。
PostGISのデータベース名を設定する
作成するPostGISのデータベース名を入力します。この後、環境設定のダイアログがいくつか表示されます。
これでインストールは終了です。
環境変数の設定
コマンドラインツールを使えるように、環境変数のPathを設定します。PowerShellで下記のコードを実行します。
$oldSystemPath = [System.Environment]::GetEnvironmentVariable("Path", "User") $oldSystemPath += ";C:\Program Files\PostgreSQL\10\bin" [System.Environment]::SetEnvironmentVariable("Path", $oldSystemPath, "User")
PowerShellを再起動して「psql -v」と入力して実行してみてください。上の画像のようになりましたか?
シェープファイルを取り込んでみる
Shapefile and DBF Loaderを起動する
「PostGis 2.0 Shapefile and DBF Loader Exporter」を起動します。スタートボタンを押してshpと入力して検索すると、すぐ出てくると思います。
サーバーに接続する
赤丸部分のボタンを押して、サーバーに接続します。
ダイアログが表示されます。Usernameには「postgres」、
Databaseには、こちらで設定したデータベース名(postgis_25_sample)を入力します。Passwordにはこちらで入力した文字列を入力します。
接続に成功すると、上のようなメッセージが表示されます。
シェープファイルを選択する
接続したデータベースにインポートするシェープファイルを選択します。赤丸部分のボタンを押下すると、ファイル選択のダイアログが表示されるので、シェープファイルを選択します。
SRIDを設定する
選択したファイルがリストに追加されます。SRIDには、選択したシェープの空間参照系のコードを入力します。
インポートできた?
インポートに成功すると、上のようなメッセージが表示されます。
QGISで開いてみる
QGISで表示してみます。ブラウザの「PostGIS」のメニューから、「新しい接続」を選択します。
名前は適当でいいです。ホストにはPostGISをインストールしたPCのアドレス(他のPCにインストールしたのでなければlocalhostと入力してください)、データベースには先ほどシェープファイルをインポートしたデータベース名を入力します。下の赤で囲った部分は必要に応じてチェックしますが、今回はQGISで表示するだけなので、何もチェックしないでいいです。
設定ができたら接続してみます。
ダイアログが表示されるので、シェープファイルをインポートするときに入力したユーザー名とパスワードを入力します。
接続に成功すると、先ほどインポートしたファイル名がpublicの下に表示されていると思います。ダブルクリックしてみると...
インポートしたシェープファイルがマップに表示されます。お疲れさまでした。
numpy-quaternionを使ってみる
Pythonで四元数を使う方法について調べていたところ、numpy-quaternion · PyPIに辿り着きました。このページでは、numpy-quaternionのインストール方法について紹介していきます。
インストール
pipを実行する
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」と警告が出たら...
使ってみると、こんな警告が表示されました。どうやらnumbaというものをインストールしたほうがいいよってことだそうなので...
numbaをインストールする
管理者権限でpowershellを起動して、次のコマンドを実行します。
pip install numba
先ほどのソースコードの3行目に次のコードを追加して実行してみます。すると、今度は警告が出なくなりました。
import numba
numpy-quaternionの使い方
下記のページのUsageには、numpy-quaternionの使い方が幾つかのサンプルで紹介されていますので、ご覧になってみてください。
ありがとうございました