5

Numba でスピードアップしたいクラスがあります。このクラスは、特定のシードを使用して NumPy の RandomState のインスタンスを作成するだけで、各インスタンスに「乱数ジェネレーター」を使用します (したがって、後で作業を複製できます)。Numba の autojit を使用すると、「通常の」Python では発生しない奇妙なエラーが発生します。

幸いなことに、この動作は非常に簡単に再現できます。エラーを説明する簡単な例を次に示します。

from numpy.random import RandomState
from numba import autojit

# ------- This works in "regular Python" ------------

class SillyClass1(object):
    def __init__(self, seed):
        self.RNG = RandomState(seed)
    def draw_uniform(self):
        return self.RNG.uniform(0,1)

test1 = SillyClass1(123456)

test1.draw_uniform()

# Output:
# 0.12696983303810094


# The following code -- exactly the same as above, but with the @autojit 
# decorator, doesn't work, and throws an error which I am having a hard  
# time understanding how to fix:

@autojit
class SillyClass2(object):
    def __init__(self, seed):
        self.RNG = RandomState(seed)
    def draw_uniform(self):
        return self.RNG.uniform(0,1)

test2 = SillyClass2(123456)

test2.draw_uniform()

# Output:
#
# ValueError                                Traceback (most recent call last)
# <ipython-input-86-a18f95c11a1b> in <module>()
#      10 
#      11 
# ---> 12 test2 = SillyClass2(123456)
#      13 
#      14 test2.draw_uniform()
# 
# ...
# 
# ValueError: object of too small depth for desired array

Ubuntu 13.10 で Anaconda ディストリビューションを使用しています。

何かご意見は?

編集:NumPysの「numpy.random.RandomState」の代わりにPythonの標準「random.Random」を使用するだけの回避策を見つけました

例:

from random import Random 
@autojit
class SillyClass3(object):
    def __init__(self, seed):
        self.RNG = Random(seed)
    def draw_uniform(self):
        return self.RNG.uniform(0,1)

test3 = SillyClass3(123456)

test3.draw_uniform()

# Output:
# 0.8056271362589

これは私の当面のアプリケーションで機能します(他の問題がすぐに発生しましたが、万歳)。

ただし、この修正は、numpy.random.RandomState を使用する必要があることがわかっている将来のアルゴリズムでは機能しません。だから私の質問はまだ残っています - 元のエラー、および/または Numba で numy.random.RandomState を使用するための回避策に関する洞察を持っている人はいますか?

4

1 に答える 1