cython吧 关注:4贴子:26

踩坑避雷,警示后人

只看楼主收藏回复

最近用Cython做项目,感觉对于Cython的资料与资源有点稀少,自己通过不断试错,才能保证项目的实施。
那就开此记录贴,记录一下今后遇到的知识点,万一有人也需要呢?


IP属地:山东来自Android客户端1楼2024-12-22 22:38回复
    ① 在类里,定义成员属性就像Java一样,定义在类里而非函数里;类的初始化先执行__cinit__构造方法后执行__init__方法,所以我们可以在前者里赋值而在后者里调用方法。


    IP属地:山东来自Android客户端2楼2024-12-22 22:43
    回复
      ② cdef可以用来定义变量、函数、类以及一些C类型。
      用cdef定义函数,则为cfunction,仅能在cython里调用,在python里访问不到;而用cdef定义类,在Python里能访问到并且可以实例化,但类里的cfunction通过对象名则访问不到。
      值得注意的是,cdef不能用来定义特殊方法,比如__lshift__、__eq__之类的。


      IP属地:山东来自Android客户端3楼2024-12-22 22:50
      回复
        ③ 对于cpdef,仅能用来定义函数,也就是cpfunction,既能够被cython也能被python调用,用的不是很多其实说实话。


        IP属地:山东来自Android客户端4楼2024-12-22 22:53
        回复
          ④ 在.pyx文件里,不能不声明就直接使用或赋值变量,Python里的那套不适用了,有点不适应其实。


          IP属地:山东来自Android客户端5楼2024-12-22 22:55
          回复
            ⑤ 用cdef声明的类型,或是声明的函数返回类型,不是所有的类型都正确,除了C类型,可以的Py类型也就是最基本的,就比如int float list tuple set bool等,况且bool最好用bint类型替代,bint就是0/1,而像类啊之类的,只能用object声明。


            IP属地:山东来自Android客户端6楼2024-12-22 22:59
            回复
              ⑤-1 还有就是,在C枚举类型与C结构体类型里,也是适用于以上规则。


              IP属地:山东来自Android客户端7楼2024-12-22 23:01
              回复
                💤


                IP属地:山东来自Android客户端8楼2024-12-22 23:04
                回复
                  说实话,Cython现在还是没有一个方便的编码环境,虽然vscode里有插件比较方便,但是嘛,不是很方便运行之类的,还要出去cmd或bat运行,我打算写一个编码器,虽然可能很简陋,但希望可以解决不方便这个痛点。


                  IP属地:山东来自Android客户端9楼2024-12-22 23:13
                  回复
                    每日➕3


                    IP属地:山东来自Android客户端10楼2024-12-23 22:29
                    收起回复
                      每日➕3


                      IP属地:山东来自Android客户端11楼2024-12-24 12:35
                      收起回复
                        经验➕3


                        IP属地:山东来自Android客户端12楼2024-12-25 13:31
                        收起回复
                          在cfunction里,星花*默认为指针,而Python里的解包失效。


                          IP属地:山东来自Android客户端13楼2024-12-28 20:10
                          回复
                            在cython里,指针赋值之类的其实不被允许


                            IP属地:山东来自Android客户端14楼2024-12-28 20:11
                            回复
                              cdef struct/union/class在声明成员时不能直接指定默认值。
                              cdef class的父类除了object和type外不能使用py class。


                              IP属地:山东来自Android客户端15楼2024-12-28 21:12
                              回复