1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Numba初心者用】高速化が実現されているかチェックするために、nopython=Trueにしておくほうが良い(version 0.50.0以前の場合)

Last updated at Posted at 2020-03-09

注: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モードの実行が失敗した場合にエラーを返してくれるので安全です。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?