[学习Cython编程]Cython编程入门
本文主要以[Learning Cython Programming]一书中的案列和我自己编写的简单程序来学习Cython。
一:Python调用C函数
mycode.c文件
#include <stdio.h>int myfunc (int x, int y)
{printf ("look we are within your c code!!\n");return x + y;
}
mycode.h文件:
#ifndef __MYCODE_H__
#define __MYCODE_H__
extern int myfunc (int, int);
#endif //__MYCODE_H__
我们将通过Python调用myfunc函数。
mycodepy.pyx文件:
cdef extern from "mycode.h":cdef int myfunc (int, int)def callCfunc ():print myfunc (1,2)
cdef是Cython的关键字,说明要引用外部的声明。我们创建一个callCfunc函数是有必要的,这是对C中函数的包装,Cython会处理好Python和C之间的类型转换。
注意当cdef开始一个块的时候,下面所有的类型默认都已添加cdef关键字。我们还可以传递参数给callCFunc,下面是我修改后的mycodepy.pyx文件:
cdef extern from "mycode.h":int myfunc (int, int)def callCfunc ():print myfunc (1,2)def f(a,b):print a,bprint myfunc(a,b)
这里还有一点,在定义f时可使用C语言的关键字,如def f(int a,int b),Cython将会优化代码,减少类型转换,增加效率。即使同样的算法,使用C的关键字将带来质的飞跃。
Makefile文件如下:
all:cython mycodepy.pyxgcc -g -O2 -fpic -c mycodepy.c -o mycodepy.o `python-config --includes`gcc -g -O2 -fpic -c mycode.c -o mycode.ogcc -g -O2 -shared -o mycodepy.so mycodepy.o mycode.o `python-config --libs`clean:rm -f mycodepy.c *.o *.so
这里需要提示一下,‘python-config'是编译python时提供的一个命令行工具,目的是更容易的找到Python的头文件和库文件位置。
如在我系统中,
python-config --includes: -I/usr/local/include/python2.6
pyhton-config --libs: -lpthread -ldl -lutil -lm -lpython2.6
运行结果:
二:Python中使用C的结构体
mycode.h文件:
#ifndef __MYCODE_H__
#define __MYCODE_H__struct mystruct {char * string;int integer;char ** string_array;
};extern void printStruct (struct mystruct *);#endif //__MYCODE_H__
mycode.c文件:
#include <stdio.h>
#include "mycode.h"void printStruct (struct mystruct * s)
{printf (".string = %s\n", s->string);printf (".integer = %i\n", s->integer);printf (".string_array = \n");int i;for (i = 0; i < s->integer; ++i) printf ("\t[%i] = %s\n", i, s->string_array [i]);
}
我们将通过Python调用printStruct函数:
mycodepy.pyx:
cdef extern from "mycode.h":struct mystruct:char * stringint integerchar ** string_arrayvoid printStruct (mystruct *)def testStruct ():cdef mystruct scdef char *array [2]s.string = "Hello World"s.integer = 2array [0] = "foo"array [1] = "bar"s.string_array = arrayprintStruct (&s)
我们可以看出结构体也需要块分隔符,这里需要注意当你定义使用C中的类型时,需要明确的使用cdef关键字,告诉编译器你要的是C类型而不是PyObject类型。
注意当使用cdef定义结构体时不需要struct关键字,如上所示。
三:Python中使用C的枚举,typedef和函数指针
mycode.h文件:
#ifndef __MYCODE_H__
#define __MYCODE_H__
typedef enum _cardsuit{CLUBS,DIAMONDS,HEARTS,SPADES
}cardsuit;
extern void printCard(cardsuit);
typedef void (*pcard)(cardsuit);
#endif
mycode.c文件:
#include "mycode.h"
void printCard(cardsuit c)
{switch(c){case CLUBS:printf("CLUBS\n");break;case DIAMONDS:printf("DIAMONDS\n");break;case HEARTS:printf("HEARTS\n");break;case SPADES:printf("SPADES\n");break;}}
在这里我们定义了一个枚举{梅花,方片,红桃,黑桃},定义了一个printCard函数打印传递的牌的花色,同时使用typedef给枚举定义了一个简单形式,且定义了形如printCard函数的函数指针。下面我们就通过Python来调用printCard函数和函数指针。
mycodepy.pyx文件:
cdef extern from "mycode.h":enum _cardsuit:CLUBS,DIAMONDS,HEARTS,SPADESctypedef _cardsuit cardsuitvoid printCard(cardsuit)ctypedef void (*pcard)(cardsuit)def Pcard():cdef cardsuit card_c=CLUBSprintCard(card_c)cdef cardsuit card_h=HEARTScdef pcard p=&printCardp(card_h)
Cython中ctypedef等同于C的typedef,代码也比较简单易懂,分别用函数调用一次和函数指针调用一次,结果如下:
[学习Cython编程]Cython编程入门相关推荐
- 《Python编程:从入门到实战》(第2版)学习笔记 第5章 if语句
[写在前面]为进一步提高自己的python代码能力,打算把几本经典书籍重新过一遍,形成系统的知识体系,同时适当记录一些学习笔记,我尽量及时更新!先从经典的<Python编程:从入门到实战> ...
- 一、 Python 基础知识笔记 —— 《Python编程:从入门到实践(第二版)》学习笔记
前言 先安利这本书<Python编程:从入门到实践(第二版)>,作者埃里克-马瑟斯,很适合新手入门,我的python入门学习就是以这本书为核心: 再安利一个网站:菜鸟教程-Python3教 ...
- 零基础怎样自学编程?新手如何学习编程?编程学习入门指南
对于编程,很多新手的第一感觉可能就是: 高深,难学. 学好编程,有的时候,可以把一些需要我们重复劳动的工作,自动化批量处理,为我们节省很多时间和精力. 对于一些学得比较深入的朋友来说,更是可以通过它找 ...
- UE4入门学习4:C++编程介绍
- - 文章 UE4入门学习4:C++编程介绍 作者 游蓝海( http://blog.csdn.net/you_lan_hai ) UE4直接使用C++作为逻辑层语言,这样引擎层与逻辑层语言统一,不 ...
- 编程比赛 介绍 入门 及 学习路线
内容若有不足与纰漏,请多指教! 文章目录 写在前面 编程比赛介绍 蓝桥杯 天梯赛 CPC类 比赛 编程比赛要点注意 赛前 赛中 赛后 编程比赛常见术语 比赛相关 常见术语 编程 | 学习 学习 | 练 ...
- UE4学习笔记1st:编程快速入门
UE4学习笔记1st:编程快速入门 今天我开始学习虚幻4游戏引擎,为了此我专门买了新的电脑,我将主要配置写在这里,有想学习的同学可以参考 显卡:丽台K620 CPU:E3-1230-V3 主板:b85 ...
- 《Python编程:从入门到实战》学习笔记(第2版) 第1-2章 起步变量和简单数据类型
[写在前面]为进一步提高自己的python代码能力,打算把几本经典书籍重新过一遍,形成系统的知识体系,同时适当记录一些学习笔记,我尽量及时更新!先从经典的<Python编程:从入门到实战> ...
- python快速编程入门课后简答题答案-Python编程:从入门到实践(第2版)第1章习题答案...
<Python编程:从入门到实践>是一本不错的书.第2版已经公开预售,预计会在10月份正式上市. 动手试一试 本章的练习都是探索性的,但从第2章开始将要求你用那一章学到的知识来解决问题. ...
- python编程入门课 视频教程-Python编程零基础入门课
[课程简介] 本课程面向零基础小白,以Python最热门的应用领域基础为目标,设计强延展性的课程大纲.课程内容从Python的概念和安装开始,不仅讲授每一个Python本身的基础知识点,包括数据结构. ...
- python编程入门课程视频-带学《Python编程:从入门到实践》
以<Python编程:从入门到实践>为教材,以吕老师+几位同学学习串讲为主线,系统的进行python的入门,并手把手带着大家做课后习题. 教材简介: <python编程从入门到实践& ...
最新文章
- C++ 函数参数传递:传值,传指针,传引用
- Visual Studio 2008 每日提示(十四)
- OC中的数组,常使用的函数,怎样将字符串写到文件中,将数组写到文件中
- C#线程系列(3):线程池和文件下载服务器
- 声明一个const数组
- 日志和告警数据挖掘经验谈——利用日志相似度进行聚类,利用时间进行关联分析...
- 如何防止android软件被反编译,破解盗版
- ZOJ2091(贪心)
- reactor多线程模型_网络编程模型的演进之路
- 【.NET Core项目实战-统一认证平台】第十六章 网关篇-Ocelot集成RPC服务
- 调试opencv程序显示应用程序无法正常启动,0xc000007b
- 把cpp编译为so_基于VSCode和CMake进行C/C++开发第三讲GCC编译器
- stylus之选择器(Selectors)
- oracle删除唯一索引sql语句_高级SQL之在选择语句中使用更新和删除
- 完全卸载sql2005
- 使用zabbix-agent2自定义插件获取https证书过期时间
- 服务器虚拟化的毕业设计,云桌面技术研究与应用毕业设计论文+开题报告+翻译+源码...
- 2019测试指南-web应用程序安全测试(二)识别应用程序入口点
- 一个简单的前后端分离案例
- prince2 成功的项目管理_学员心得 | 宋文彬:学习PRINCE2的心路历程