差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン次のリビジョン両方とも次のリビジョン | ||
programming:python:packages:numba [2020/07/01] – [型を教える] ikatakos | programming:python:packages:numba [2020/07/01] – [型を教える] ikatakos | ||
---|---|---|---|
行 324: | 行 324: | ||
* 意外と(? | * 意外と(? | ||
- | ===== 型を教える | + | ===== 型指定 |
'' | '' | ||
行 392: | 行 392: | ||
- | ==== 自動再コンパイル ==== | ||
- | |||
- | Numbaを使用する上で「ソースが変わってなければコンパイル済みのものを使い、更新されていたら再コンパイル」を自動でできると便利。 | ||
- | |||
- | モジュールにコンパイル時のソースコードのファイルハッシュ値を埋め込んで、 | ||
- | 使う時に一致しなければ再コンパイルする、ということが出来ないか試した。 | ||
- | |||
- | しかし、ハッシュ値を得るため一度 '' | ||
- | そのPythonプロセス中は.pydファイルが使用中としてOSに捕まれてしまい、 | ||
- | 再コンパイルにより同名のファイルを作ろうとしても上書きできず途中でエラーになってしまった。 | ||
- | そして明示的に解放する方法が見つからなかった。 | ||
- | ハッシュ値を記録するのをモジュールとは別のテキストファイル等にすると回避できる。 | ||
- | |||
- | 毎回ファイルハッシュを計算するので大きなソースコードには不向きだし、 | ||
- | 自身のファイルしか確認しないため他ファイルの関数を読み込んでいた場合は見逃してしまうが、 | ||
- | そのような制約を把握した上で、単純にコンパイルを必要最小限に出来る。 | ||
- | |||
- | 以下から、メイン関数の中身と、それに与える引数を準備する部分を変更すればよい。 | ||
- | |||
- | <sxh python> | ||
- | import os | ||
- | import sys | ||
- | from hashlib import sha1 | ||
- | |||
- | import numpy as np | ||
- | |||
- | # メイン関数 | ||
- | def solve(inp): | ||
- | a, b, c = inp | ||
- | return a + b + c | ||
- | |||
- | |||
- | def cc_compile(): | ||
- | from numba.pycc import CC | ||
- | |||
- | cc = CC(' | ||
- | cc.export(' | ||
- | cc.compile() | ||
- | print(' | ||
- | |||
- | with open(__file__, | ||
- | file = sha1(rh.read()).hexdigest() | ||
- | with open(' | ||
- | wh.write(file) | ||
- | |||
- | |||
- | if not os.path.exists(' | ||
- | cc_compile() | ||
- | else: | ||
- | with open(__file__, | ||
- | file = sha1(rh.read()).hexdigest() | ||
- | with open(' | ||
- | c_file = rh.read() | ||
- | if file != c_file: | ||
- | cc_compile() | ||
- | |||
- | # noinspection PyUnresolvedReferences | ||
- | from my_module import solve | ||
- | |||
- | # 関数に与える引数準備など | ||
- | inp = np.fromstring(sys.stdin.read(), | ||
- | ans = solve(inp) | ||
- | print(ans) | ||
- | </ | ||