第1篇:Cython的数据类型

前言:这遍文章,是翻译自官方文档,觉得原官方文档的例子有些抽象,所以我用一些具体的示例代码替换了。

Python作为一种动态语言, 它鼓励的编程风格优先考虑类和对象的方法和属性方面,而不是它们如何适合哪种类继承结构。

这可以使Python成为一种非常轻松和舒适的快速开发语言,但需要付出代价 - 管理数据类型的繁重工作会被转嫁到解释器上。在运行时,解释器需要搜索命名空间,获取属性以及解析参数和关键字元组方面会消耗大量的时间。这种运行时“后期绑定”是Python相对缓慢的主要原因。而Cython就使用类似于C++"早期绑定的"技术,并且保留了大部分C/C++的特性,在编译静态版本的扩展库后,速度基本上等同于C/C++的运行速度.

C变量和类型定义

cdef语句用于声明C变量,无论是本地变量还是模块级变量:

cdef int age;
cdef float score;

//声明一个结构体
cdef struct Person:
  int age
  char* name
#end-cdef

注意Structs可以声明为cdef packed struct,它与C指令具有相同的效果

结构体的初始化

  • 使用struct的字面量进行初始化
cdef Person p
p=Person(23,"Lisa")
  • 使用类似关键的参数方式进行初始化
cdef Person p
p=Person(age=23,name="Lisa")
  • 使用Python的dict进行赋值,这将使用Cython的自动转换功能对结构体逐个成员赋值。 请注意,这涉及更多的Python开销
cdef Person p
p={"age":23,"name":"Lisa"}

目前没有用于定义常量的特殊语法,但您可以为此目的使用匿名枚举声明,例如:

cdef enum:
   OPEN=1
   CLOSE=0
#end-cdef

注意:struct,union和enum仅在定义类型时使用,而不是在引用它时使用。 例如,要声明一个指向Person的指针变量,你会写:

cdef struct Person: 
    char* name
    int age
#end-cdef
/**正确写法**/
cdef Person *jk

/*错误写法*/
cdef struct Person *jk

cdef 还可以用于声明属于c / cython的函数

cdef  int add(int a,int b):
    return a+b
#end-cdef

Cython中有三种函数定义:

  • def:Python函数是使用def语句定义的,就像在Python中一样。它们将Python对象作为参数并返回Python对象。
  • cdef:Cython函数使用新的cdef语句定义。它们将Python对象或C值作为参数,并且可以返回Python对象或C值。
  • cpdef:Hybrid函数(别以为是某田的混动技术-___,-),允许从任何地方调用cpdef声明的混合函数,但在从其他Cython代码调用时Hybrid函数会获得C一样的速度。

即使从Cython调用,也可以通过子类或实例属性上的Python方法覆盖cpdef声明的方法或属性。如果发生这种情况,就得不到性能的提升,即使它没有被覆盖,跟调用cdef方法相比,从Cython调用cpdef方法的开销很小,可以忽略不计。

Cython函数中的参数

可以使用常规C声明语法将任一类型的函数的参数声明为具有C数据类型。 例如:

当Python函数的参数声明为具有C数据类型时,它将作为Python对象传入,并在可能的情况下自动转换为C值。 请看如下示例:

//python函数
def eat(int n,char* food):
    return f'今天我吃了{n}次{food}'
#end-def

/*等价于*/
def eat(n,food):
     cdef int i=n
     cdef char* food=food
     return f'今天我吃了{n}次{food}'
#end-def

目前,只能对数字类型,字符串类型和结构体进行自动转换(以递归方式组合任何这些类型); 尝试将任何其他类型用于Python函数的参数将导致编译时错误。在处理字符串的时候,在调用一个引用后必须确保该指针是否正被用, 可以从Python映射中获取结构,如果要在函数返回后,在处理字符串的时候,必须确保该指针是否正在使用。另一方面,Cython函数可以具有任何类型的参数,因为它们是使用普通的C函数调用直接传递的。

使用带有Python对象返回类型的cdef声明的函数(如Python函数),当执行离开函数体而没有显式返回值时,将返回None值。这与C / C ++形成对比,后者使返回值未定义。 在非Python对象返回类型的情况下,返回等价于零的值,例如,0表示int,False表示bint,NULL表示指针类型。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 文章转自:https://zhuanlan.zhihu.com/p/24311879 当人们提到 Python 的...
    yalesaleng阅读 36,980评论 3 10
  • 姓名:唐来宾 学号:17101223417 转载http://mp.weixin.qq.com/s/S6BN8P4...
    ahbz_t阅读 1,258评论 0 1
  • Cython代码和Python代码区别 代码运行在IPython-Notebook中,在IPython-Noteb...
    Arthurcsh阅读 1,109评论 0 2
  • 我 独行于门前小路 , 耳边环绕着音乐。 第一次,去往远方, 我不要看他们的眼睛, 我不会回头, 我怕,我忍不住。...
    汐陽阅读 148评论 0 0
  • 今天带着一诺去上班,把这两天落下的作业补上,我知道我不在家他就是“老大”,肯定不会学习,爷爷奶奶管不了她。可能有点...
    诺诺辰辰妈妈阅读 135评论 0 3