差分

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

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
次のリビジョン両方とも次のリビジョン
programming:python:packages:numba [2020/07/01] – [型を教える] ikatakosprogramming:python:packages:numba [2020/07/04] – [引数・戻り値に使える主な型] ikatakos
行 94: 行 94:
   * (*2) Unicode文字列(Python3における通常の文字列)   * (*2) Unicode文字列(Python3における通常の文字列)
   * (*2) numba.typed.List, numba.typed.Dict   * (*2) numba.typed.List, numba.typed.Dict
-  * コンパイル済み関数 +  * コンパイル済み関数(いろいろ制約あり)
-    * 引数としてのみ使用可+
  
-その他もあるかも知れないけど、どこ見れば書いてあるのかよくわかってない。 +その他もあるかも知れない。 
-なるべく上の3つのみを使うようにした方がよさそう。(個々の問題点は後述)+ 
 +なるべく上の3つのみを使うようにした方がよさそう。
  
 (*1)はdeprecatedで今後使えなくなる可能性が高い。 (*1)はdeprecatedで今後使えなくなる可能性が高い。
行 129: 行 129:
   * [[https://numba.pydata.org/numba-doc/dev/reference/pysupported.html#list|Supported Python features — Numba 0.50.0.dev0+236.g64fbf2b-py3.7-linux-x86_64.egg documentation]]   * [[https://numba.pydata.org/numba-doc/dev/reference/pysupported.html#list|Supported Python features — Numba 0.50.0.dev0+236.g64fbf2b-py3.7-linux-x86_64.egg documentation]]
  
-どちらも、Pythonのlist機能をNumbaで出来る範囲で表現することを目的としたデータ構造。+どちらも、Pythonのlist機能に似せようなデータ構造。一応、以下の違いがある
  
-  * reflected list: Pythonのlistをそのまま受け取ってNumbaで解釈できるようにしたもの+  * reflected list: 扱い上はPythonのlistのまま、制約を加えてNumbaで解釈できるようにしたもの
   * typed list: Numba独自のリスト構造クラス   * typed list: Numba独自のリスト構造クラス
  
-reflected list は deprecated。下記を読むと、ネスト等で複雑になると限界があるので typed listに置きかえていく方針らしい。+reflected listは deprecated。ネスト等で複雑になると限界があるのでtyped listに置きかえていく方針らしい。
  
   * [[http://numba.pydata.org/numba-doc/latest/reference/deprecation.html#deprecation-of-reflection-for-list-and-set-types|Deprecation Notices — Numba 0.50.1 documentation]]   * [[http://numba.pydata.org/numba-doc/latest/reference/deprecation.html#deprecation-of-reflection-for-list-and-set-types|Deprecation Notices — Numba 0.50.1 documentation]]
  
-そのため、reflected list は(問題なく使えるものの)ver.0.45以降では警告が出る。+そのため、reflected listは(今のところ問題なく使えるものの)ver.0.45以降ではその旨の警告が出る。
  
 また、typed listの方は「実験的機能」とされていて、バグがあったり、高速化の恩恵が少なくなる可能性が言及されている。 また、typed listの方は「実験的機能」とされていて、バグがあったり、高速化の恩恵が少なくなる可能性が言及されている。
行 149: 行 149:
  
   * reflected list   * reflected list
-    * 外部から与える際はネスト不可。要素の型は統一されている必要がある +    * 外部から与える際はネスト不可Numba関数内部で生成する場合はネスト可 
-    * Numba関数内部ではネスト可 +    * Numba関数内部で「''a = [0, 1]''」とすると、こちらになる
-    * Numba関数内部で「''a = [0, 1]''などとすると、こちらになる+
   * typed.List   * typed.List
     * ネスト可     * ネスト可
-    * ''numba.typed.List()'' で空のインスタンスを生成、1つずつappendする+    * 一度に生成することはできなくて、''numba.typed.List()'' で空のインスタンスを生成、1つずつappendする((ver.0.49で、コンストラクタにイテレータを渡せるようになった))
  
 また、Pythonのデータ構造にはListの他にSet, Dictがあるが、 また、Pythonのデータ構造にはListの他にSet, Dictがあるが、
行 271: 行 270:
 </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: 行 303:
     * 意外と(?)、ほぼ全ての機能を使える     * 意外と(?)、ほぼ全ての機能を使える
  
-===== 型を教える =====+ 
 +===== グローバル変数 ===== 
 + 
 +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: 行 395:
  
  
-==== 自動再コンパイル ==== 
- 
-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