本文主要以[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编程入门相关推荐

  1. 《Python编程:从入门到实战》(第2版)学习笔记 第5章 if语句

    [写在前面]为进一步提高自己的python代码能力,打算把几本经典书籍重新过一遍,形成系统的知识体系,同时适当记录一些学习笔记,我尽量及时更新!先从经典的<Python编程:从入门到实战> ...

  2. 一、 Python 基础知识笔记 —— 《Python编程:从入门到实践(第二版)》学习笔记

    前言 先安利这本书<Python编程:从入门到实践(第二版)>,作者埃里克-马瑟斯,很适合新手入门,我的python入门学习就是以这本书为核心: 再安利一个网站:菜鸟教程-Python3教 ...

  3. 零基础怎样自学编程?新手如何学习编程?编程学习入门指南

    对于编程,很多新手的第一感觉可能就是: 高深,难学. 学好编程,有的时候,可以把一些需要我们重复劳动的工作,自动化批量处理,为我们节省很多时间和精力. 对于一些学得比较深入的朋友来说,更是可以通过它找 ...

  4. UE4入门学习4:C++编程介绍

    - - 文章 UE4入门学习4:C++编程介绍 作者 游蓝海( http://blog.csdn.net/you_lan_hai ) UE4直接使用C++作为逻辑层语言,这样引擎层与逻辑层语言统一,不 ...

  5. 编程比赛 介绍 入门 及 学习路线

    内容若有不足与纰漏,请多指教! 文章目录 写在前面 编程比赛介绍 蓝桥杯 天梯赛 CPC类 比赛 编程比赛要点注意 赛前 赛中 赛后 编程比赛常见术语 比赛相关 常见术语 编程 | 学习 学习 | 练 ...

  6. UE4学习笔记1st:编程快速入门

    UE4学习笔记1st:编程快速入门 今天我开始学习虚幻4游戏引擎,为了此我专门买了新的电脑,我将主要配置写在这里,有想学习的同学可以参考 显卡:丽台K620 CPU:E3-1230-V3 主板:b85 ...

  7. 《Python编程:从入门到实战》学习笔记(第2版) 第1-2章 起步变量和简单数据类型

    [写在前面]为进一步提高自己的python代码能力,打算把几本经典书籍重新过一遍,形成系统的知识体系,同时适当记录一些学习笔记,我尽量及时更新!先从经典的<Python编程:从入门到实战> ...

  8. python快速编程入门课后简答题答案-Python编程:从入门到实践(第2版)第1章习题答案...

    <Python编程:从入门到实践>是一本不错的书.第2版已经公开预售,预计会在10月份正式上市. 动手试一试 本章的练习都是探索性的,但从第2章开始将要求你用那一章学到的知识来解决问题. ...

  9. python编程入门课 视频教程-Python编程零基础入门课

    [课程简介] 本课程面向零基础小白,以Python最热门的应用领域基础为目标,设计强延展性的课程大纲.课程内容从Python的概念和安装开始,不仅讲授每一个Python本身的基础知识点,包括数据结构. ...

  10. python编程入门课程视频-带学《Python编程:从入门到实践》

    以<Python编程:从入门到实践>为教材,以吕老师+几位同学学习串讲为主线,系统的进行python的入门,并手把手带着大家做课后习题. 教材简介: <python编程从入门到实践& ...

最新文章

  1. C++ 函数参数传递:传值,传指针,传引用
  2. Visual Studio 2008 每日提示(十四)
  3. OC中的数组,常使用的函数,怎样将字符串写到文件中,将数组写到文件中
  4. C#线程系列(3):线程池和文件下载服务器
  5. 声明一个const数组
  6. 日志和告警数据挖掘经验谈——利用日志相似度进行聚类,利用时间进行关联分析...
  7. 如何防止android软件被反编译,破解盗版
  8. ZOJ2091(贪心)
  9. reactor多线程模型_网络编程模型的演进之路
  10. 【.NET Core项目实战-统一认证平台】第十六章 网关篇-Ocelot集成RPC服务
  11. 调试opencv程序显示应用程序无法正常启动,0xc000007b
  12. 把cpp编译为so_基于VSCode和CMake进行C/C++开发第三讲GCC编译器
  13. stylus之选择器(Selectors)
  14. oracle删除唯一索引sql语句_高级SQL之在选择语句中使用更新和删除
  15. 完全卸载sql2005
  16. 使用zabbix-agent2自定义插件获取https证书过期时间
  17. 服务器虚拟化的毕业设计,云桌面技术研究与应用毕业设计论文+开题报告+翻译+源码...
  18. 2019测试指南-web应用程序安全测试(二)识别应用程序入口点
  19. 一个简单的前后端分离案例
  20. prince2 成功的项目管理_学员心得 | 宋文彬:学习PRINCE2的心路历程

热门文章

  1. 01:高斯噪声和椒盐噪声
  2. 高性能图片服务器–ZIMG
  3. windows10 安装
  4. Nexus私服简介及搭建
  5. 1、Python培训 Python 简介
  6. 初学C语言,还在犹豫如何选择入门教材吗?这几本书籍建议收藏
  7. Linux字符串截取
  8. 北极寒流带来《后天》享受(组图)零下50度美国城市成灾区出门都犯法
  9. android和苹果内存,安卓的8G运行内存为什么与苹果3G的运行内存不能抗衡?
  10. onKeyUp方法简介