我有一个分析代码,它使用numpy执行一些繁重的数值运算。只是为了好奇,尝试用cython编译它,只做很少的改动,然后我用循环重写了它的numpy部分。令我惊讶的是,基于循环的代码要快得多(8x)。我无法发布完整的代码,但我整理了一个非常简单的不相关计算,显示出类似的行为(尽管时间差异不是那么大):版本1(无cython)importnumpyasnpdef_process(array):rows=array.shape[0]cols=array.shape[1]out=np.zeros((rows,cols))forrowinrange(0,rows):out[row,:]=np.s
我正在学习Cython,现在正在试验它。我尝试了基本的cdef类示例程序,它运行良好。现在我想做的是在cdef类类型中混合使用cdef和非cdef属性,就像这样cdefclassContext:cdefpublicintbyteIndex,bitIndexdef__init__(self,msg="",msg_len=0):self.msg=msgself.msg_len=msg_lenself.byteIndex=0self.bitIndex=7但是一旦我实例化对象我就得到错误!!AttributeError:'c_asnbase.Context'对象没有属性'msg'这是否意味着一
我有一个.pyx文件,我在其中定义了一些函数,例如cdefdoublefoo(doublea)nogil:return3.*a我如何在pyx文件之外对此类函数的行为进行单元测试?由于它们是cdef,我无法简单地导入它们... 最佳答案 要测试cdef功能,您需要在Cython中编写测试。可以尝试使用cpdef函数,但并非所有签名都可以在这种情况下使用(例如使用指针的签名,如int*、float*等等)。要访问cdef函数,您需要通过pxd文件“导出”它们(对于cdef-functionsofextensiontypes也可以这样做)
我想知道在声明函数时def、cdef和cpdef之间的区别。def和其他def之间的区别或多或少是清楚的。而且我还看到,有时它会在声明中添加返回类型(cdefvoid/double/int...name),有时则不会。我也想知道如何在cython中声明一个字符串变量,因为我不知道,我把它声明为对象。 最佳答案 主要区别在于可以从哪里调用函数:def函数可以从Python和Cython调用,而cdef函数可以从Cython和C调用。两种类型的函数都可以使用类型化和非类型化参数的任意混合声明,并且在这两种情况下,Cython将内部结构编