2016-04-10 7 views
0
cdef int bs_contains_nogil(float_or_int[:] l,float_or_int t,int size) nogil: 
    cdef int low=0 
    cdef int high=size-1 
    cdef int mid=0 
    while(low<=high): 
     mid=(low+high)//2 
     if t==l[mid]: 
      return mid 
     elif t < l[mid]: 
      high=mid-1 
     else: 
      low=mid+1 
    return -(low+1) 

@boundscheck(False) 
@wraparound(False) 
def insertplace_nogil(l,t): 
    idx=(<object (*)(int[:],int,int)>bs_contains_nogil)(l,t,len(l)) 
    return idx //return the target position 

Über den Code geben Sie mir einen Fehler (Typ ist nicht spezialisiert), jemand wissen, wie man dieses Problem, dieses Problem, danke.Cython fusioniert kann nicht

+0

Welche Art von Fehler gibt es Ihnen? Auch die ganze Zeile, in der Sie den Wert von 'idx' setzen, ist verrückt. Was versuchst du zu machen? Es gibt eine extrem hohe Chance, dass wir das vereinfachen können. –

+0

Sorry für die nicht klar von Code, ich möchte die Zielposition im Array zurückgeben, Danke. – user3035661

Antwort

0

Sie können wählen Sie die int Spezialisierung der Ihrer verschmolzenen Typs Funktion einfach mit eckigen Klammern (as discussed in the documentation) versuchen.

# for completeness 
ctypedef fused float_or_int: 
    float 
    int 

cdef int bs_contains_nogil(float_or_int[:] l,float_or_int t,int size) nogil: 
    return 5 # your function goes here... I've cut this down for simplicitity since I don't think it's the main point of your question. 

def insertplace_nogil(l,t): 
    return bs_contains_nogil[int](l,t,len(l)) 

Beachten Sie, dass Sie nur einmal den Typ angeben müssen (das heißt l und t müssen beide vom gleichen Typ sein). Das ist (denke ich?), Wo du falsch liegst.

+0

Danke, genau das, was ich machen möchte! Danke vielmals! – user3035661

0

Sie haben mehrere Syntaxprobleme, und ich denke, Sie haben dies nur ein bisschen zu kompliziert gemacht. Auch soweit ich weiß, müssen Sie einen Typ für Parameter zu einer Cdef-Funktion auswählen oder stattdessen ein Python-Objekt verwenden, das ist wahrscheinlich der Grund, warum Sie einen typbezogenen Fehler bekommen. Ich habe nicht getestet, aber ein

cdef int bs_contains_nogil(int[:] l, int t,int size) nogil: 
    cdef int low=0 
    cdef int high=size-1 
    cdef int mid=0 
    while(low<=high): 
     mid=(low+high)/2 
     if t==l[mid]: 
      return mid 
     elif t < l[mid]: 
      high=mid-1 
     else: 
      low=mid+1 
    return low+1 

@boundscheck(False) 
@wraparound(False) 
def insertplace_nogil(l,t): 
    return bs_contains_nogil(l,t,len(l)