2016-04-10 6 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 

上記のコードは私にエラー(タイプは特化していません)を与えてくれていますが、いずれにしてもこの問題をスローする方法はわかります。Cython融合はキャスティングできません。

+0

どのようなエラーが表示されますか?また、 'idx'の値を設定した行全体が狂っています。あなたは何をしようとしているのですか?私たちはそれを単純化する可能性が非常に高いです。 –

+0

申し訳ありませんが、コードの明確さのために、私は配列の目標位置を返す、ありがとう。 – user3035661

答えて

0

を試してみるていません。あなたは一度だけのタイプを指定する必要が

# 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)) 

注(すなわちltは両方とも同じ型でなければなりません)。これはあなたが間違っていたところです(私は思う?)。

+0

ありがとう、ちょうど私がやりたいこと!どうもありがとう! – user3035661

0

あなたはいくつかの構文上の問題を抱えていますが、これはあまりに複雑すぎると思いました。また、私が知る限り、cdef関数へのパラメータの型を1つ選ぶか、代わりにPythonオブジェクトを使用する必要があります。これはおそらく、型に関連したエラーが発生している可能性があります。私はこれをテストしたが、このaはあなたが簡単に角括弧(as discussed in the documentation)を使用して、融合型機能のint専門を選択することができます

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)