私は64ビット符号付き整数のpython型intの行列を構築しようとしています。配列のcython/numpy型
cdef matrix33():
return np.zeros((3,3),dtype=int)
cdef do_stuf(np.ndarray[int, ndim=2] matrix):
...
return some_value
def start():
print do_stuf(matrix33())
それは右のコンパイルが、私はそれを実行したとき、私はこのエラーを取得しておいてください。
ValueError: Buffer dtype mismatch, expected 'int' but got 'long'
私はpythonの長いのでは動作しないことができますが、私は適切に64に変換する方法がわかりませんint。
UPDATE
オーケー。私はCythonを正しく使用していると確信しています。私が書いたコードは、go/atariをキャプチャするゲームのminmax検索用でした。
圧倒的に呼び出される関数はこれらです:
cdef isThere_greedy_move(np.ndarray[np.int64_t, ndim=2]board, int player):
cdef int i, j
for i in xrange(len(board)):
for j in xrange(len(board)):
if board[i,j] == 0:
board[i,j] = player
if player in score(board):
board[i,j] = 0
return True
board[i,j] = 0
return False
# main function of the scoring system.
# returns list of players that eat a stone
cdef score(np.ndarray[np.int64_t, ndim=2] board):
scores = []
cdef int i,j
cdef np.ndarray[np.int64_t, ndim = 2] checked
checked = np.zeros((board.shape[0], board.shape[1]), dtype = int)
for i in xrange(len(board)):
for j in xrange(len(board)):
if checked[i,j] == 0 and board[i,j] !=0:
life, newly_checked = check_life(i,j,board,[])
if not life:
if -board[i,j] not in scores:
scores.append(-board[i,j])
if len(scores) == 2:
return scores
checked = update_checked(checked, newly_checked)
return scores
# helper functions of score/1
cdef check_life(int i, int j, np.ndarray[np.int64_t, ndim=2] board, checked):
checked.append((i,j))
if liberty(i,j,board):
return True, checked
for pos in [[1,0],[0,1],[-1,0],[0,-1]]:
pos = np.array([i,j]) + np.array(pos)
if check_index(pos[0],pos[1],len(board)) and board[pos[0],pos[1]] == board[i,j] and (pos[0],pos[1]) not in checked:
life, newly_checked = check_life(pos[0],pos[1],board,checked)
if life:
checked = checked + newly_checked
return life, checked
return False, [] # [] is a dummy.
cdef liberty(int i,int j, np.ndarray[np.int64_t, ndim=2] board):
for pos in [np.array([1,0]),np.array([0,1]),np.array([-1,0]),np.array([0,-1])]:
pos = np.array([i,j]) - pos
if check_index(pos[0],pos[1],len(board)) and board[pos[0],pos[1]] == 0:
return True
return False
私は本当にこれがcythonのために輝くチャンスだろうと思っているだろう。それはどちらも、Pythonのtimeモジュールで今すぐ°
60℃未満のi7プロセッサー上で試験した一貫2.03 あるcythonで、
のPython 2.7は、一貫性のある2.28秒の処理を行います。 は3x3のキャプチャが行く解決するために、私は
ありがとうございました、コードが正しく実行されます。しかし、それは私がすべてを長く宣言したときと同じくらい速く走ります。私は長いオブジェクトが高速ではないことを知っています。オーバーフローすることができず、異なる処理を受けます(より多くのサイクルを使用します)。オーバーフローする可能性のあるintを使用したいと思います。これは、長いpython型よりも高速です。 – Ihmahr
また、翻訳されたPythonの速度が10%を少し下回っているため、私はタイプが正しくないことが疑わしいです。 – Ihmahr
@ user1020753:タイプが正しいです。スピードアップは、あなたの機能で何をしているかによって異なります。 –