具体的なコードの質問というよりは抽象的な質問です。
・要約した質問
Pythonで「listよりnumpy.ndarrayのほうが処理が速い」というのは、必ずしもそうだとも言えないのか。
・質問とその背景
Pythonで数独パズルを解くプログラムを書きました。問題の盤面を9×9のリスト形式(下コードのような形)で与えると、それについて解いてくれるものです。
python3
1#問題の例 2#0は空白マスを表す 3sudoku_problem = [[0,0,5,3,0,0,0,0,0], 4 [8,0,0,0,0,0,0,2,0], 5 [0,7,0,0,1,0,5,0,0], 6 [4,0,0,0,0,5,3,0,0], 7 [0,1,0,0,7,0,0,0,6], 8 [0,0,3,2,0,0,0,8,0], 9 [0,6,0,5,0,0,0,0,9], 10 [0,0,4,0,0,0,0,3,0], 11 [0,0,0,0,0,9,7,0,0]] 12#「世界一難しい数独」で調べると出てくる問題です。
上記の問題だと約1.5秒で解いてくれます。
ひとまずプログラムが完成したので、次はこれを高速化しようとしました。
完成したプログラムではpythonのリストオブジェクトを多用しているのですが、「pythonのリストの操作は処理が遅い、データ型の決まっているnumpy.ndarrayを使ったほうが高速」のような話を聞いていたので、プログラムの内問題の盤面とそれに関する処理をすべてnumpy.ndarrayの形式に書き換えました。
python3
1#問題の入力形式をnumpy.ndarrayに変えた 2import numpy as np 3sudoku_problem = np.array([[0,0,5,3,0,0,0,0,0], 4 [8,0,0,0,0,0,0,2,0], 5 [0,7,0,0,1,0,5,0,0], 6 [4,0,0,0,0,5,3,0,0], 7 [0,1,0,0,7,0,0,0,6], 8 [0,0,3,2,0,0,0,8,0], 9 [0,6,0,5,0,0,0,0,9], 10 [0,0,4,0,0,0,0,3,0], 11 [0,0,0,0,0,9,7,0,0]], dtype='int8')
しかし、そうしてできたプログラムを実行してみると、処理にかかる時間が元のプログラムより30倍ほど長くなってしまいました。
もともとのプログラムがfor文をガンガン回す感じもので、その構造については変更後もほぼかえていないので「あんまり早くならないかもな」ぐらいに思っていたのですが、
numpy.ndarrayの処理は普通のリストより早くなるものだと思っていたので大幅に遅くなったことが意外でした。
例えば行列計算なんかの処理をガンガンやる場合には、numpyを使うとデータ型は固定だしfor文をあまり書かなくて済むので高速になる、というのは多分あってると思うのですが、
そういう処理をやらない場合、numpyは単なるlist型の上位互換としては見ないほうがいいということでしょうか。
ぼんやりした質問で申し訳ないですがどなたか意見をくださると幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。