2012-02-28 16 views
5

साइथन/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 प्रोसेसर पर परीक्षण किया गया है मेरे लिए सवाल है कि अगर मैं इस परियोजना के लिए हास्केल या सी ++ करने के लिए स्विच करने के लिए ...

उत्तर

6

Cython के int प्रकार एक सी int, यानी आम तौर पर (लेकिन जरूरी नहीं) 32-बिट रूप में ही है जा रहा हूँ है। आप matrix33np.int64 के रूप में dtype और में do_stuf अपनी सी समकक्ष के रूप में, np.int64_t घोषित करना चाहिए:

cimport numpy as np 
import numpy as np 

cdef do_stuff(np.ndarray[np.int64_t, ndim=2] matrix): 
    pass 

cdef matrix33(): 
    return np.zeros((3,3), dtype=int) 

def start(): 
    print do_stuff(matrix33()) 
+0

धन्यवाद, कोड अब सही चलाता है। लेकिन, जब मैं सबकुछ लंबा घोषित करता हूं तो यह उतना तेज़ चलता है जितना तेज़ करता है। मुझे पता है कि लंबी वस्तु तेज नहीं है, क्योंकि यह अतिप्रवाह नहीं हो सकती है और इसका इलाज अलग होता है (अधिक चक्र का उपयोग करता है)। मैं एक इंट का उपयोग करना चाहता हूं जो अतिप्रवाह हो सकता है और यह अजगर प्रकार से अधिक तेज़ है। – Ihmahr

+0

इसके अलावा, व्याख्या किए गए पायथन पर गति केवल 10% से कम है, जो मुझे संदिग्ध बनाती है कि मेरे पास सही प्रकार नहीं हैं ... – Ihmahr

+0

@ user1020753: प्रकार सही हैं। स्पीडअप इस बात पर निर्भर करता है कि आप अपने कार्यों में क्या कर रहे हैं। –