首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cython熔断不能铸造

Cython熔断不能铸造
EN

Stack Overflow用户
提问于 2016-04-10 05:43:31
回答 2查看 184关注 0票数 0
代码语言:javascript
复制
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

上面的代码给了我一个错误(Type不是专门的),任何人都知道如何解决这个问题,谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-10 14:24:37

您可以使用方括号int轻松地选择融合类型函数的(如文件所述)专门化。

代码语言:javascript
复制
# 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必须都是相同的类型)。这是(我想?)你在哪里出了差错。

票数 1
EN

Stack Overflow用户

发布于 2016-04-10 06:17:37

您有几个语法问题,我认为您使这有点太复杂了。而且,据我所知,您必须为cdef函数的参数选择一种类型,或者使用python对象,这可能是您获得与类型相关的错误的原因。我还没有测试过这个,但试试看

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36526289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档