专栏首页钱塘小甲子的博客Cython入门到放弃(一)

Cython入门到放弃(一)

        python作为一门强大的脚本语言,优势自然不必说,目前中低频的量化投资基本都是使用python作为research和production作为语言。但是,当我们的模型较复杂,运算量较大的时候,python的短板就会出现,就是运算速度慢。

        当然,解决这一问题有很多方法,比如笔者先前提到的pypy的jit技术,但是抛开稳定性不提,使用pypy有很多限制,而且不是那么工程化。所以,从本文开始,笔者向大家介绍Cython的一系列文章,方便将来量化或者别的应用场景中的一些重计算的部分单独取出来,然后用Cython改写,独立成模块来提高运算速度。

        首先,大家都知道,C语言是编译性语言,而Python则是解释性语言,简而言之,就是Python运行是逐行运行,不需要实现编译,而C需要在运行前编译。那么,可想而知,如果运行前,需要事先编译,那么其实有一种“上帝视角”的感觉,自然可以做很多优化,让代码运行的更快。

        而Cython的出现就是这个目的,让Python也可以被编译,然后执行。大家要区别Cpython和Cython,Cpython大家可以认为是python的一种,其实大家平时使用的基本都是cpython。而Cython大家可以直接理解为一种语言,Cython是一种部分包含和改变C语言,以及完全包含pyhton语言的一个语言集合。学习一段时间后大家肯定会更加理解这句话。

        我们先来过一下cython编写的流程吧。

        在写cython之前,我们需要一个c编译器,笔者目前使用的是win10,不知道怎么的,就是不能像以前win7一样好好玩,所以直接在linux下面编译了。如果大家是windows平台,需要先安装一个专门为python准备的编译器,笔者的版本是2.7的,链接如下:

https://www.microsoft.com/en-us/download/confirmation.aspx?id=44266

        然后就是测试一下流程了。首先我们要知道,cython的文件后缀是.cyx,而且既然cython是python语言的一个超集,那么,cyx里面运行纯python文件也是没有问题的了。

        我们新建一个hello.pyx文件,在里面输入

print "Hello World"

        没有任何特殊,然后我们新建一个setup.py脚本,这个python文件的目的就是使用cython编译器去编译pyx折一个cython文件。

        setup文件的代码很简单:

from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("hello.pyx")
)

        然后我们运行一下setup文件,python setup.py build_ext --inplace. build_est大概就是编译extension文件的意思,inplace则是放到源代码pyx旁边,也就是同一目录下的意思。

        然后,我们就可以看到多了两个文件,一个是hello.c一个是hello.so(如果你是windows,那么应该是.pyd)

        这里,c文件就是cython将我们的pyx文件解析成一个c文件件,不依赖与平台,而后面的so或者pyd文件,则是将c文件进行编译后的一个文件,依赖于平台。

        这个时候,so文件或者pyd文件就可以像普通的python文件一样,被import。

        当然,每次如果都要这样写个setup文件编译一下,其实挺麻烦的,还好cython给我们提供了一个很方便的解决方案。

写完hello.pyx的cython代码之后,不需要编译,当我们需要使用的时候,在文件前面加上

import pyximport
pyximport.install()
import hello

        然后就可以了。其实,不是不用编译了,而是cython默默帮我们编译好了,放在其他地方罢了,对于我们使用者而言,整体就简洁好的诺。

        这就是一个cython使用的初步,性能如何,以及cython语法,将在后面的部分中讲述。

参考数据:Cython A Guide for Python Programming

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 多因子模型之因子(信号)测试平台----计算因子值

            近一个半月疯狂的接触多因子模型,其中对于单个因子的回测,是最熟的。而对于单个因子,或者叫做signal(这一系列文章后续都这么叫),是多因子模型...

    钱塘小甲子
  • Python使用Hadoop进行词频统计

    今天,我们利用python编写一个MapReduce程序,程序的目的还是百年不变的计算单词个数,也就是WordCunt。

    钱塘小甲子
  • vn.py2-行情记录的使用

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    钱塘小甲子
  • 集群提交客户机搭建步骤

    1 拷贝如下脚本内容至需要安装的客户机,保存为 emr-install-clients.sh:

    腾讯云ES团队
  • [产品技术] Operational Transformation

    昨天心情不太好,本来不打算写东西了,但想想坚持了这么久,还是写点什么吧。 最近sharejs升级到了0.7,看文档说整套代码重写了一遍,API基本都变了。想起以...

    tyrchen
  • 如何使用 Python 分析笔记本电脑上的 100 GB 数据

    许多组织正试图收集和利用尽可能多的数据,以改进其业务运营方式、增加收入或对周围世界产生更大的影响。因此,数据科学家面对 50GB 甚至 500GB 大小的数据集...

    AI研习社
  • 如何衡量运营商SDN的成功与否

    六年来,运营商SDN是成功的还是失败的?要回答这个问题,首先要确定人们对运营商SDN的期望值,并且如果考虑到人们早期对SDN和NFV的过高的预期,未能达到预期是...

    SDNLAB
  • SDN已经Out了?是你Out了! 从三个应用案例看SDN在企业网的发展

    SDN从诞生以来就争议缠身,传统势力说SDN就是皇帝的新衣,无非是运维自动化;新兴厂商说SDN是前所未有的革命,要被革命的传统厂家一叶障目。到了2017年,争论...

    SDNLAB
  • SDN已经Out了?是你Out了! ——从三个应用案例看SDN在企业网的发展

    SDN从诞生以来就争议缠身,传统势力说SDN就是皇帝的新衣,无非是运维自动化;新兴厂商说SDN是前所未有的革命,要被革命的传统厂家一叶障目。到了2017年,争论...

    SDNLAB
  • 未来几年SDN将进一步提升云服务利润率

    云计算、大数据、移动互联网等技术趋势的全面兴起,使得ICT行业向“软件定义”方向倾斜的趋势越发明显,软件定义网络SDN和网络功能虚拟化NFV等未来网络技术也越发...

    SDNLAB

扫码关注云+社区

领取腾讯云代金券