开篇:第一个Cython程序

欢迎来到Cython教程。 Cython的目的是充当Python和C / C ++之间的中介。 从本质上讲,Cython是Python语言的超集,它允许为变量和类属性添加数据类型,然后可以将其转换为C代码和Python的C扩展。

与非Python程序员朋友和同事交流,很可能您已经被问及为什么使Python,正确来说是CPython是一种“慢”语言!确实慢~!,最大的诟病就是GIL限制,因此python是一个“伪并行”的语言。所以为了纠正GIL这个诟病后来才有各种python的分支,Jython,Ipython,pypy等,并形成各自的软件生态。现在python这个名词从概念上已经不是某种动态语言的专属名词,它更像各种静态语言实现它的一种动态语言规范.

而这里Cython作为CPython的一种祢补方案,我们熟知Numpy,Pandas和Scikit这样的库都是C优化的。 当你使用它们时,你实际上是在利用C / C ++的强大功能,而Python只是作为一种胶水语言提供了这些库的应用接口支持。 更进一步说,Numpy,Pandas和Scikit-learn都使用了Cython! 很有可能,这些流行的库中使用Python + C优化的代码,如果你的C和python功底扎实的话,使用Cython将比你自己编写的C代码快得多。OK,学习cpython的最终归属其实就是C/C++,也可以说是Cython!

n=7.0

在python的角度里可以随意对变量n赋予任何它支持的数据类型。因为Python每次都会检查你的类型,这种“动态类型”检测必定造成时间消耗,这也是python会被认为慢的其中一个因素。

我们可以使用静态类型和Cython来获得速度上的提升。 许多静态语言更像是:

float n = 5.0

而Cython 就会是这样

cdef float x = 5.0

当然你需要将x保持为float,但是,只要使用静态类型,你就会得到很大的回报。 要做到这一点,我们需要两件事.

  • cython :很简单通过pip install cython安装即可
  • c/c++编译器:
  1. Linux系统并且作为开发用途的话,基本gcc c/c++编译工具都有的 ,不清楚的话请自行搜索其他相关文章。
  2. Windows用户请查看关于MinGw环境搭建的Cython官方教程https://cython.readthedocs.io/en/latest/src/tutorial/appendix.html

由于我写本文用到的是mac所以重点,以mac搭建的环境为主.一旦你有Cython和编译器,让我们通过Cython工作流程并制作我们自己的C-Exension! 让我们从一个简单的python文件开始:
先创建一个后缀名为.pyx的cython源文件

def say_hello(name):
    return f'Hello,{name}^_^'
#end-def

接下来创建一个setup.py文件

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize('example_cython.pyx'))

接下来,在您的终端中,执行以下命令:

python setup.py build_ext --inplace

现在应该创建一个build目录,一个C文件(hello.c)和有一些反馈信息

Cython directive 'language_level' not set, using 2 for now (Py2). This will change in a later release! File: /Volumes/Seagate/cytest/hello.pyx
  tree = Parsing.p_module(s, pxd, full_module_name)
running build_ext
building 'hello' extension
creating build
creating build/temp.macosx-10.9-x86_64-3.7
jkmac:cytest apple$ 

和下面两条gcc链接和编译的指令,copy后分别手动执行一次

gcc -Wno-unused-result -Wsign-compare -Wunreachable-code \
     -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall \
     -arch x86_64 -g \   
     -I/Library/Frameworks/Python.framework/Versions/3.7/include/
      python3.7m 
     -c hello.c -o build/temp.macosx-10.9-x86_64-3.7/hello.o
gcc -bundle -undefined dynamic_lookup -arch x86_64 \
      -g build/temp.macosx-10.9-x86_64-3.7/hello.o 
      -o /Volumes/Seagate/cytest/hello.cpython-37m-darwin.so

之后会生成一个共享对象文件(.so).在这个示例中应该是hello..so的类似名称,我们就导入我们的C扩展。

hello.cpython-37m-darwin.so就是我们需要的c扩展

最后,为了测试我们的扩展是否成功,新建一个python文件,这里是app.py

from hello import say_hello
print(say_hello('jck308'))

我们运行一次 传递我的昵称'jck308'可以正常输出.


OK,开了个头,其他后续,敬请期待...

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

推荐阅读更多精彩内容

  • 姓名:唐来宾 学号:17101223417 转载http://mp.weixin.qq.com/s/S6BN8P4...
    ahbz_t阅读 1,207评论 0 1
  • Python 现在越来越火,已经迅速扩张到包括 DevOps、数据科学、Web 开发、信息安全等各个领域当中。 然...
    志者不俗阅读 639评论 0 1
  • 目前Python主要应用领域: 云计算: 云计算最火的语言, 典型应用OpenStack WEB开发: 众多优秀的...
    Clemente阅读 942评论 0 1
  • 吴宇晨:阳光下 天儿很好时候,我会陪着爷爷在北边我喜欢的静谧小路散步。 爷爷得了老年病,他常常不会和我...
    九九_3bc0阅读 133评论 0 1
  • 一、Rss Feed 围绕着InnoSpace孵化器,关键词经常有:创业、科技新闻、VC、程序员、开放办公。 我们...
    梅晨斐阅读 688评论 0 2