質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

9823閲覧

numbaの使い方〜初期化では空リストであるクラスのメンバ変数

spectrum

総合スコア44

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/06/13 01:49

編集2017/06/13 02:50

numbaを使い以下のclassを高速化したいです。

import numpy as np class test(object): def __init__(self): self.turn = 0 self.array = np.zeros((10,10), dtype=np.int32) self.flag = True self.point = []

ただし、pointは((0,0),[(0,0),(0,1),...,(3,4)])が要素になった配列として使います。(値は適当です)
これを、numbaを使って型を指定すると、

import numpy as np from numba import jitclass, float32, int32, boolean, typeof from numba.types import Tuple, List spec = [('turn', int32), ('array', int32[:,:]), ('flag', boolean), ('point', typeof([((0,0),[(0,0)])])) ] @jitclass(spec) class test(object): def __init__(self): self.turn = 0 self.array = np.zeros((10,10), dtype=np.int32) self.flag = True self.point = []

であっていると思うのですがうまく行きません。
このようなエラー文(一部をコピペ)が出力されます。

[1] During: lowering "$0.17 = build_list(items=[Var($0.16, test_numba3.py (12))])" at test_numba3.py (12) Failed at nopython (nopython mode backend) list(((int64 x 2), list((int64 x 2)))): unsupported nested memory-managed object File "test_numba3.py", line 12 [1] During: lowering "$0.17 = build_list(items=[Var($0.16, test_numba3.py (12))])" at test_numba3.py (12) [2] During: resolving callee type: jitclass.test#1e0c210<turn:int32,array:array(int32, 2d, A),flag:bool,point:reflected list(((int64 x 2), reflected list((int64 x 2))))> [3] During: typing of call at <string> (3)

また、この時

self.point = [((0,0),[(0,0)])]

と書いても、同じエラーが返ります。

もし解決法をご存知の方がございましたら、お教えいただけると大変うれしいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

原因
nopythonモードでnumbaを作動させていますが、このモードは、最高のパフォーマンスコードが生成される反面、関数内のすべての値のネイティブ型が推測できる必要があります。
問題の部分はデータがネストしており型推論が効かないためエラーになっています。

解決方法
明示的に型を指定する。

http://numba.pydata.org/numba-doc/0.12.2/tutorial_types.html

numbaのネストデータの扱いをしたことがないので確証はもてませんが、上の方法で行けると思います。
それでもエラーが出る場合はネストしているデータをnemedtupleやclassなどに展開し、データがネストしないような形にすればよいと思います。


追記
https://stackoverflow.com/questions/38682260/how-to-nest-numba-jitclass

こちらに同じ問題が有りました、classに展開すれば実現できると思います。

投稿2017/06/13 05:36

編集2017/06/13 10:54
pashango2

総合スコア930

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

他の部分での依存関係があったため、変数の構造を書き換えることはしませんでした。
cython を使い、ボトルネック部分をcで書き換えました。

投稿2017/08/31 04:26

spectrum

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問