IT狗工作室

第1篇:Cython的数据类型(第三部分)

2020-04-15  本文已影响0人  铁甲万能狗

Python的主要功能之一是自动内存管理。 CPython通过简单的引用计数来实现这一点,它具有一个自动运行的垃圾收集器,该垃圾收集器会定期运行以清理不可达的引用周期。Cython会为我们处理所有引用计数,确保Python对象(无论是静态类型的还是动态的)在其引用计数达到零时完成。

在Cython中混合使用静态和动态变量时,CPython的自动内存管理具有一定的意义。 举例来说,我们有两个Python字节对象b1和b2,我们想在将它们加在一起后提取底层的char指针:

%%cython

s1=b"Hello "
s2=b"World"

cdef char *buf=s1+s2

s1 + s2表达式是一个临时的Python字节对象,分配时会尝试使用Cython的自动转换规则提取该临时对象的char指针。 由于添加的结果是一个临时对象,因此前面的示例无法正常工作-添加的临时结果在创建后立即删除,因此char缓冲区不能引用有效的Python对象。 幸运的是,Cython能够捕获该错误并发出编译错误。


ss8.png

一旦理解,正确的处理方法就很简单-只需使用一个临时Python变量,是动态变量的:

%%cython

s1=b"Hello "
s2=b"World"

s=s1+s2
cdef char *buf=s

或者我们可以静态指定一个C类型的bytes

%%cython

s1=b"Hello "
s2=b"World"

cdef bytes s=s1+s2
cdef char *buf=s

这些情况并不常见。这只是一个问题,因为C级对象引用的是由Python对象管理的数据。因为Python对象拥有基础字符串,所以C char*缓冲区无法告诉Python它具有另一个(非Python)引用。我们必须创建临时字节对象,以便Python不会删除字符串数据,并且必须确保只要需要C char *缓冲区,就可以维护临时对象。表3-2中列出的其他C类型都是值类型,而不是指针类型。对于这些类型,Python数据在赋值期间被复制(C语义),从而允许C变量与用于初始化它的Python对象独立存在。

正如Cython理解动态Python变量和静态C变量一样,它也理解两种语言的函数,并允许我们使用两种语言

上一篇下一篇

猜你喜欢

热点阅读