差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
次のリビジョン両方とも次のリビジョン
programming:python:packages:numba [2020/07/01] – [型を教える] ikatakosprogramming:python:packages:numba [2020/07/01] ikatakos
行 271: 行 271:
 </sxh> </sxh>
  
-==== グローバル変数 ==== 
  
-Numba関数内からグローバル変数にアクセスしても、それがNumbaに対応した型なら使える。 
- 
-ただし、AOT や ''jit(cache=True)'' などでコンパイル結果をキャッシュする場合、__グローバル変数はコンパイル当時のもので固定される__。 
- 
-  * [[http://numba.pydata.org/numba-doc/latest/developer/caching.html#caching-limitations|Notes on Caching — Numba 0.50.1 documentation]] 
- 
-<sxh python> 
-glb = 5 
- 
-@njit('i8()', cache=True) 
-def global_test(): 
-    return glb 
- 
-print(global_test())  # => 5 
- 
-glb = 6 
- 
-print(global_test())  # => 5 
-</sxh> 
 ===== 使える関数 ===== ===== 使える関数 =====
  
行 324: 行 304:
     * 意外と(?)、ほぼ全ての機能を使える     * 意外と(?)、ほぼ全ての機能を使える
  
-===== 型を教える =====+ 
 +===== グローバル変数 ===== 
 + 
 +Numba関数内からグローバル変数にアクセスしても、それがNumbaに対応したなら使える。 
 + 
 +ただし、AOT や ''jit(cache=True)'' などでコンパイル結果をキャッシュする場合、__グローバル変数はコンパイル当時のもので固定される__。 
 + 
 +  * [[http://numba.pydata.org/numba-doc/latest/developer/caching.html#caching-limitations|Notes on Caching — Numba 0.50.1 documentation]] 
 + 
 +<sxh python> 
 +glb = 5 
 + 
 +@njit('i8()', cache=True) 
 +def global_test(): 
 +    return glb 
 + 
 +print(global_test())  # => 5 
 + 
 +glb = 6 
 + 
 +print(global_test())  # => 5 
 +</sxh> 
 + 
 + 
 +===== 型指定 =====
  
 ''@njit()'' の引数には、関数の引数と戻り値の型(Signature)を指定することができる。 ''@njit()'' の引数には、関数の引数と戻り値の型(Signature)を指定することができる。
行 392: 行 396:
  
  
-==== 自動再コンパイル ==== 
- 
-Numbaを使用する上で「ソースが変わってなければコンパイル済みのものを使い、更新されていたら再コンパイル」を自動でできると便利。 
- 
-モジュールにコンパイル時のソースコードのファイルハッシュ値を埋め込んで、 
-使う時に一致しなければ再コンパイルする、ということが出来ないか試した。 
- 
-しかし、ハッシュ値を得るため一度 ''import my_module'' すると、 
-その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('my_module') 
-    cc.export('solve', '(i8[:],)')(solve) 
-    cc.compile() 
-    print('Compiled', file=sys.stderr) 
- 
-    with open(__file__, 'rb') as rh: 
-        file = sha1(rh.read()).hexdigest() 
-    with open('my_module_ver', 'w') as wh: 
-        wh.write(file) 
- 
- 
-if not os.path.exists('my_module_ver'): 
-    cc_compile() 
-else: 
-    with open(__file__, 'rb') as rh: 
-        file = sha1(rh.read()).hexdigest() 
-    with open('my_module_ver', 'r') as rh: 
-        c_file = rh.read() 
-    if file != c_file: 
-        cc_compile() 
- 
-# noinspection PyUnresolvedReferences 
-from my_module import solve 
- 
-# 関数に与える引数準備など 
-inp = np.fromstring(sys.stdin.read(), dtype=np.int64, sep=' ') 
-ans = solve(inp) 
-print(ans) 
-</sxh> 
  
programming/python/packages/numba.txt · 最終更新: 2023/10/03 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0