注:Numba version 0.50.0以降はobject mode fall-backが廃止になる予定(http://numba.pydata.org/numba-doc/latest/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit) で、本記事の内容はそれ以前のバージョンに限ります。
Numbaって何?という方はこの方の記事をご覧ください:
https://qiita.com/gyu-don/items/9d223b007ca620e95abc
Numbaではまずnopythonモードで高速化を試み、それに失敗したらobjectモード(却って遅くなる)に切り替えて実行します(object mode fall-back)。
ところが、わりと些細なコードの変更でnopythonモードになるか否かが変わってくるため、安全のために最初からnopython=Trueに設定しておいたほうが良い、ということが本記事の内容です。(デフォルトはnopython=Falseで、これをnopython=Trueにしておくとnopythonモードが失敗した時にはエラーを返してくれます。)
例えば以下のコードで、assert文をコメントアウトした場合はnopythonモード、コメントアウトしない場合はobjectモードで実行されます。
import numpy as np
import numba
@numba.jit
def myfunc():
for i in range(1000):
for k in range(1000):
#assert 0<1
pass
hoge = [1,2,3]
hoge = np.array(hoge)
myfunc()
このコードの場合は、そもそも同一の変数名hogeに異なる型(リストとndarray)の変数を割り当てている時点でNumba的に良い書き方ではないのですが、そのような悪い書き方の場合でもnopythonモードで実行される場合があるようです。しかしforループの中にassert文があると、途端にobjectモードになってしまいました(私には原因は分かりません)。
また、良い書き方をしている場合でも、nopythonモードがサポートしていない関数を使うとobjectモードになってしまいます。例⇒ http://numba.pydata.org/numba-doc/latest/reference/deprecation.html#id1
最近のNumbaのバージョンでは、nopythonモードの実行が失敗した時は警告メッセージが出るのですが、古いNumbaのバージョンではnopythonモードが失敗しても警告メッセージが出ない(version 0.48.0では警告が出ましたが、version 0.41.0では警告が出ませんでした)ので、いろいろコードをいじっている時に突然に実行速度が遅くなっても、原因に気づきにくいです。
@numba.jit(nopython=True)とすると、nopythonモードの実行が失敗した場合にエラーを返してくれるので安全です。