साइथन/numpy प्रकार मैं एक 64 बिट हस्ताक्षरित पूर्णांक, पाइथन प्रकार int के एक मैट्रिक्स बनाने की कोशिश कर रहा हूँ।एक सरणी
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'
मैं अजगर लंबे के साथ काम नहीं कर सकते हैं, लेकिन मैं नहीं जानता कि कैसे ठीक एक 64 कन्वर्ट करने के लिए पूर्णांक।
अद्यतन
शाबाशी। मुझे पूरा यकीन है कि मैंने साइथन सही तरीके से इस्तेमाल किया था। जिस कोड को मैंने लिखा था वह कैप्चर/अटारी जाने के खेल में एक मिनीमैक्स खोज के लिए था।
अभी तक सबसे बुलाया कार्यों ये हैं:
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 के लिए चमक का मौका होगी। हल करने के लिए 3x3 कब्जा जाना:
पायथन 2.7 एक सुसंगत 2.28 सेकंड करता है, cython साथ यह एक सुसंगत 2.03 दोनों अजगर समय मॉड्यूल के साथ और अब कम से कम 60C °
का एक i7 प्रोसेसर पर परीक्षण किया गया है मेरे लिए सवाल है कि अगर मैं इस परियोजना के लिए हास्केल या सी ++ करने के लिए स्विच करने के लिए ...
धन्यवाद, कोड अब सही चलाता है। लेकिन, जब मैं सबकुछ लंबा घोषित करता हूं तो यह उतना तेज़ चलता है जितना तेज़ करता है। मुझे पता है कि लंबी वस्तु तेज नहीं है, क्योंकि यह अतिप्रवाह नहीं हो सकती है और इसका इलाज अलग होता है (अधिक चक्र का उपयोग करता है)। मैं एक इंट का उपयोग करना चाहता हूं जो अतिप्रवाह हो सकता है और यह अजगर प्रकार से अधिक तेज़ है। – Ihmahr
इसके अलावा, व्याख्या किए गए पायथन पर गति केवल 10% से कम है, जो मुझे संदिग्ध बनाती है कि मेरे पास सही प्रकार नहीं हैं ... – Ihmahr
@ user1020753: प्रकार सही हैं। स्पीडअप इस बात पर निर्भर करता है कि आप अपने कार्यों में क्या कर रहे हैं। –