python不支持的数据类型有achar bint cfloat dlist_第1篇:Cython的数据类型(第二部分)

Cython的C指针

与C一样,尽管指针性与变量而不是类型相关联,但可以在类型或变量附近声*号。

%%cython

cdef int *a

cdef int *b

但这样在变量a,b写在一行,cython编译器会发出警告的信息,因此建议每个变量单独声明

%%cython

cdef int *a,*b

4a08fe5225a5

Cython中的指针的解引操作

在Cython中解引用指针与在C语言中不同。

由于Python语言已经使用*args和**kwargs语法来允许任意位置和关键字参数并支持函数参数解包,因此Cython不支持*

*解引语法是C指针的语法。 取而代之的是,我们在位置0的指针处建立索引,以解引Cython中的指针的引用。 这种语法也可以解引C中的指针,尽管这种情况很少见。

4a08fe5225a5

Cython的结构体与指针

无论在C中使用箭头运算符的任何地方,在Cython中的结构体都使用点运算符访问其内部的成员变量,Cython将生成正确的C级代码

%%cython -a

cdef struct Person:

char* name

unsigned int age

#end-cdef

#初始化结构体

cdef Person p=Person("jck308",32)

#声明Person类型结构体指针p_per

#并将变量p的地址赋值给指针p_per

cdef Person *p_per=&p

#访问结构体的成员

print(p.age)

print(p.name)

print(p_per.age)

print(p_per.name)

混合静态和动态类型变量

Cython允许静态和动态类型变量之间的赋值。静态和动态的这种流体混合是一个强大的特性,我们将在多个实例中使用它:它允许我们对大多数代码基使用动态Python对象,并轻松地将它们转换为性能关键部分加速、静态类型的类比。

举例来说,假设我们有几个静态int,我们想将它们组合成(动态)Python元组。使用Python/C API创建和初始化这个元组的C代码很简单,但是很繁琐,需要几十行代码,并且需要大量的错误检查。在Cython,显而易见的方法就是:

%%cython

#静态类型的变量

cdef int a=1,b=2,c=3

##动态类型的变量

tuple_of_ints=(a,b,c)

print(tuple_of_ints)

这段代码很无聊。 这里要强调的一点是,a,b和c是静态类型的整数,而Cython允许使用它们创建动态类型的Python元组。 然后,我们可以将该元组分配给动态键入的tuple_of_ints变量。 该示例的简单性是Cython强大之处:我们可以以显而易见的方式创建一个C类型int元组,而无需进一步思考。 我们希望像这样的概念上简单的事情变得简单,这就是Cython所提供的。

此示例之所以有效,是因为C类型的int与Python int之间存在明显的对应关系,因此Python可以为我们自动类型转换。 例如,如果a,b和c是C指针,则此示例无法按原样工作。 在这种情况下,我们必须解引它们,然后再将它们放入元组或使用其他策略。

例如下面的代码是个错误的例子,因为Python解释器无法识别指针类型的变量

%%cython

cdef int k=55,j=56

cdef int *a=&k

cdef int *b=&j

tuple_of_ints=(a,b)

print(tuple_of_ints)

正确的做法,如下图所示,我们通过解引指针变量a、b

4a08fe5225a5

ss8.png

给出了内置Python类型与C或C ++类型之间对应关系的完整列表

4a08fe5225a5

ss8.png

Cythond的bint类型

bint布尔整数类型是C级别的int,并与Python的bool相互转换。 它具有真实性的标准C解释:零为False,非零为True。

整数类型转换和溢出

Python 3中,所有int对象都是无限精度的。当将整数类型从Python转换为C时,Cython会生成检查溢出的代码。 如果C类型不能表示Python整数,则会引发运行时OverflowError。

4a08fe5225a5

float类型转换

Python fload存储为C double。 根据IEEE 754转换规则,将Python浮点数转换为C浮点数可能会截断为0.0或正负无穷大。

Cython的double类型会被动态转换Python的float类型

%%cython

cdef double d=384848048282945060321.3835

b=d

print(b)

print(type(b))

4a08fe5225a5

ss8.png

Complex类定

The Python complex类型存储为两个double的C结构,Cython具有浮点复数和双复数C级类型,它们对应于Python复数类型。 C类型与Python复杂类型具有相同的接口,但是使用有效的C级操作。 这包括访问实数和虚数分量的实数和imag属性,创建多个复数共轭的共轭方法,以及用于加,减,乘和除的有效运算。C级Complex类型与C99 _Complex类型或C ++ std :: complex模板化类兼容。

bytes类型

Python字节类型会自动在char *或std :: string之间来回转换。下面示例就是Cython char类型指针 动态转换为Python的bytes

%%cython

cdef char* s="Hello World"

b=s

print(b)

print(type(b))

用Python类型静态声明变量

到目前为止,我们一直使用cdef静态声明C类型的变量。 也可以使用cdef静态声明Python类型的变量。 我们可以对内置类型(例如list,tuple和dict)执行此操作; 扩展类型,例如NumPy数组; 还有很多其他

并非所有的Python类型都可以静态声明:它们必须用C实现,并且Cython必须有权访问该声明。 内置的Python类型已经满足了这些要求,并且声明它们很简单。 例如Python典型的集合类型list,dict,str,set(str就是集合类型,字符串数组):

cdef list mylist

cdef dict mydi

cdef str pname

cdef set myset

此示例中的变量是完整的Python对象。 在后台,Cython将它们声明为指向某些内置Python结构类型的C指针。 它们可以像普通的Python变量一样使用,但是受其声明类型的约束:

%%cython

cdef list mylist=[k+1 for k in range(1,11)]

pylist=mylist

print("mylist:",mylist)

print("删除pylist索引2的元素")

del pylist[2]

print(mylist)

在这里,通过删除pylist第3个元素也会删除mylist的第3个元素,因为它们引用的是同一列表。mylist和pylist之间的一个区别是,mylist只能引用Python列表对象,而pylist可以引用任何Python类型。 Cython将在编译时和运行时对mylist施加类型约束。

4a08fe5225a5

备注:关于Cython更复杂的数组类型引用,可以参考此篇文章《第5篇:Cython的线性表性操作》

乍一看,Cython允许静态声明具有内置Python类型的变量似乎有些奇怪。 为什么不照常使用Python的动态类型? 答案指出了Cython的一般原理:我们提供的静态类型信息越多,Cython就能更好地优化结果。 像往常一样,该规则也有例外,但这通常是正确的。 例如,以下代码从Cython函数中返回sieveOfEratosthenes()返回一个cdef list的对象附加到动态类型的变量中:

%%cython

#cython:language_level=3

cpdef list sieveOfEratosthenes(int n):

cdef list pr = [True for i in range(n + 1)]

cdef int p = 2

cdef list res=list()

while (p * p <= n):

if (pr[p] == True):

for i in range(p * p, n + 1, p):

pr[i] = False

#end-for

#end-if

p += 1

#end-while

cdef int k

for k in range(2,n):

if pr[k]:

res.append(k)

#end-if

#end-for

return res

#end-def

#这是Python动态类型的list

primers=[]

primers=sieveOfEratosthenes(9)

print(primers)

print("调用append方法")

primers.append(11)

print(primers)

程序输出

4a08fe5225a5

Cython编译器将生成可处理任何Python对象的代码,并在运行时测试primers是否为列表。如果不是,只要它具有带参数的append方法,该代码就会运行。在后台,生成的代码首先在primers对象上查找append属性(使用PyObject_GetAttr),然后使用完全通用的PyObject_Call Python / C API函数调用该方法。 这实质上模拟了当运行等效的Python字节码时Python解释器将执行的操作。

假设上面的代码中primers变量我们使用静态声明

cdef list primers

现在,Cython可以生成专门的代码,这些代码可以直接从C API调用PyList_SET_ITEM或PyList_Append函数。 这就是上一示例中的PyObject_Call最终仍然要调用的内容,但是静态类型允许Cython绕过了Python解释器在动态调度(Dynamic Dispatch)一系列繁琐沉重的类型检测(内部类型指针查找),这也是Cython的静态版本list比Python动态版本list性能高效的原因。

关于Python解释器的动态调度的详细介绍,请查看此文《第2篇:Cython VS Python 执行原理》

Cython当前支持的集中内置可静态声明的Python类型,我们常用静态声明的可能就是list,dict

type,object

bool

complex

basestring,str,unicode,bytes,bytearray

list,tuple,dict,set,frosenset

array

slace

date,time,datetime,timedelta,tzinfo

上面的列出的中不包括直接C对应的Python类型(例如int,long和float)。 事实证明,在Cython中静态声明和使用PyIntObjects,PyLongObjects或PyFloatObjects并不容易。 幸运的是,这样做的需要很少。 我们只声明常规的C基本数据类型int,long,float和double,然后让Cython为我们进行往返于Python的自动转换。

数字字面量的基本运算

当我们对数字字面量进行加,减或乘运算时,当操作数是动态类型化的Python对象时,这些操作具有Python语义(包括对于数值大的自动Python long强制转换)。当操作数是静态类型的C变量时,它们具有C语义(即,对于有限精度的整数类型,结果可能会溢出)

除数和模数(即计算余数)值得特别提及。使用带符号整数操作数计算模数时,C和Python具有明显不同的行为:C舍入为零,而Python舍入为无穷。例如,使用Python语义时,-1%5的结果为4;但是,如果使用C语义,它将得出-1。当将两个整数相除时,Python始终检查分母,并在其为零时引发ZeroDivisionError,而C没有适当的保护措施。

对于除法/取模运算中,即便指定了C类型的静态数字变量,Cython的行为是倾向于Python的,要获取与C/C++完全相同的语义,我们可以在全局模块级别或在指令注释中使用cdivision编译器指令,如下示例所示

4a08fe5225a5

在Python 3中,在C级别,所有整数都是PyLongObjects。Cython以与语言无关的方式在C整数类型和这些Python整数类型之间正确转换,并在无法进行转换时引发OverflowError。

当我们在Cython中使用Python对象时,无论是静态声明还是动态声明,Cython仍将为我们管理对象的所有方面,包括繁琐的引用计数。下一篇我们将会谈到Cython中的引用计数和静态的字符串类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 调用dll 方法 postmessage实现后台模拟按键_VB实现模拟键盘及模拟鼠标(后台操作)...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼接下来来研究下模拟鼠标模拟鼠标的常数整理&#xff0c;如下&#xff1a;WM_MOUSEFIRST 0x0200 //移动鼠标时发生WM_MOUSEMOVE 0x0200 //移动鼠标时发生&#xff0c;同WM_MOUSEFIRSTWM_LBUTTONDOWN 0x0201 //按下鼠标左键WM_LBUTTO…

【micropython】用python来进行BadUSB的USB-HID测试(含无线控制)

转载请注明&#xff1a;小五义http://www.cnblogs.com/xiaowuyi QQ群&#xff1a;64770604 本文以TPYBoardv101开发板为例讲解了利用micropython进行BadUSB的usb-HID设备测试的主要方法&#xff0c;使用mt7681模块进行了一个简单的实验&#xff0c;实现了手机摇控键盘输入的测…

php返回类中方法,php如何获取类中所有的方法名

php获取类中所有的方法名的方法&#xff1a;可以利用【get_class_methods()】函数来获取&#xff0c;【get_class_methods()】函数可以返回指定类中所有的方法名&#xff0c;并且会将方法名保存到数组中。【相关学习推荐&#xff1a;php编程(视频)】php获取类所有方法名的方法&…

C#学习之向量运算符重载

//未重载运算符&#xff0c;但编译通过&#xff1b;C#不允许重载运算符‘’&#xff0c;但如果重载‘’运算符&#xff0c;编译器会自动使用‘’运算符的重载来执行‘’运算符的操作&#xff1b; //‘-’、‘*’、‘&’和‘/’等所有赋值运算都遵循此规则&#xff1b; 1、若…

如何安装php5.5,源码安装php5.5

centos6.6首先上传php-5.5.10至服务器安装依赖环境yum -y install gcc gcc-c autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-d…

PHP 表单文件上传的原理,php多文件上传功能实现原理及代码

今天对多图片上传功能小小的研究了一下&#xff0c;把下面的代码整理出来&#xff0c;方便以后自己使用以及供大家交流1、upload.html页面&#xff0c;即先是input typefile的文件&#xff1a;图片上传第一张图片第二张图片第三张图片第四张图片第五张图片2、do_upload.php页面…

php的c方法,thinkphp的c方法的使用

这篇文章主要介绍了关于thinkphp的c方法的使用&#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下用过thinkphp的朋友都知道&#xff0c;C()方法在整个框架中用的非常普遍&#xff0c;C方法的实现非常简单&#xff0c;但是功能非常…

Fiddler中session的请求/响应类型与图标对照表

转载于:https://www.cnblogs.com/chengchengla1990/p/5681978.html

php打印矩阵,PHP实现顺时针打印矩阵(螺旋矩阵)的方法示例

这篇文章主要介绍了PHP实现顺时针打印矩阵(螺旋矩阵)的方法,涉及PHP基于数组遍历、运算模拟打印实现螺旋矩阵功能的相关操作技巧,对PHP感兴趣的朋友可以参考下本篇文章。本文实例讲述了PHP实现顺时针打印矩阵的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;问题…

NOIP2014 uoj20解方程 数论(同余)

又是数论题 Q&A Q&#xff1a;你TM做数论上瘾了吗 A&#xff1a;没办法我数论太差了&#xff0c;得多练&#xff08;shui&#xff09;啊 题意 题目描述 已知多项式方程&#xff1a; a0a1xa2x^2..anx^n0 求这个方程在[1, m ] 内的整数解&#xff08;n 和m 均为正整数&#x…

php transfer-encoding: chunked,php – 使用chunked transfer encoding和gzip

我最近开始在我的网站上使用gzip,它在除Opera之外的所有浏览器上都起到了一种魅力作用,它给出了一个错误,即由于数据损坏而无法解压缩内容.从我可以从测试和谷歌搜索中收集到的,使用gzip和chunked传输编码可能是一个问题.请求像css文件这样的小文件时没有错误这一事实也指向了这…

@override

目录 用处 作用 注意 用处&#xff1a; 继承抽象类&#xff0c;必须实现抽象方法&#xff0c;方法上要加override 实现接口时&#xff0c;必须实现接口里定义的方法&#xff0c;方法上要加override 作用&#xff1a; 可以检查方法签名的拼写错误 改变父类中的一些行为 Override…

java实现语音发送,Java实现发送手机短信语音验证功能代码实例

这篇文章主要介绍了java实现发送手机短信语音验证功能代码实例,www.cppcns.com文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下利用第三方平台可以实现发送手机短信验证码和语音验证码的功能&#xff0c;本文使用…

c++父类和子类转化致命的代码错误

最近在工作中&#xff0c;出现了严重的代码错误&#xff0c;对象的基类和子类的继承&#xff0c;代码大致如下&#xff1a; class A { };class B : public A { }void main() {A* a;(用于子类对象来进行赋值&#xff09; new 子类;//错误代码如下B* b (B*) a;b.方法; }//在这个…

JAVA获得天气json数据的方法,获取从天气预报接口返回回来的json数据

WampServer集成环境安装与配置实习到了第三个礼拜了,原来我们小组是以开发php为主的,我们项目的服务器也是用php做的,因此我觉得很有必要学一下php的相关知识,首先当然是搭建环境了,写篇博客分享下经验. 目录: 一.软件下载 二 ...C&plus;&plus;与Lua交互(三)通过上一篇…

大专学的pHp找什么工作,大专毕业能做什么工作 毕业都去干嘛了

大专毕业能做什么工作&#xff0c;大专毕业后都去干嘛了&#xff0c;我梳理了基本信息&#xff0c;看来一下&#xff01;大专毕业能做什么工作专科生毕业之后从业的职位基础包含了社会发展的各个方面。一般能够从业自身技术专业有关的工作中&#xff0c;如果有做生意的技能&…

SpringMVC启动过程详解(li)

通过对SpringMVC启动过程的深入研究&#xff0c;期望掌握Java Web容器启动过程&#xff1b;掌握SpringMVC启动过程&#xff1b;了解SpringMVC的配置文件如何配置&#xff0c;为什么要这样配置&#xff1b;掌握SpringMVC是如何工作的&#xff1b;掌握Spring源码的设计和增强阅读…

fusioncharts json java,FusionCharts使用教程:利用XML/JSON属性加载外部LOGO

在使用FusionCharts图表时&#xff0c;你可以在运行时加载外部Logo并显示于图表中。Logo可以是GIF/JPEG/PNG或SWF文件。你可以使用chart元素的logoURL属性来加载一个Logo。XMLJSON{"chart":{ "yaxisname":"Sales Figure", "caption":&…

java redis 多节点,Redis单机多节点集群部署,超简单

1、在虚拟机中部署具有三个主节点&#xff0c;三个从节点的集群(注&#xff0c;必须要有从节点)&#xff0c;虚拟机的IP地址为192.168.133.129&#xff0c;三个主节点的部口号分别为7001(从&#xff1a;7004)、7002(从&#xff1a;7005)、7003(从&#xff1a;7006)。2、安装Red…

matlab检测串口数据帧头,MATLAB 串口读取姿态数据及GUI实时动态显示设计

上一篇实现了Matlab 对串口数据的读取&#xff0c;数据可以读取并且保存到本地。本文主要设计GUI并且动态的显示曲线。可以更直观的观察实时的姿态数据和传感器数据。GUI设计效果&#xff1a;姿态GUi.png分别设置三个区域&#xff0c;分别为数据接收显示区域&#xff0c;串口设…