嫌Python太慢了?让Cython带你飙车吧

126 篇文章 1 订阅
108 篇文章 2 订阅


很多人仅在性能方面将Python与C进行了比较,没有在快速开发方面比较,就开始抱怨Python太慢了。Python的优点在于,其开发时间非常短,你不必处理指针、内存管理等问题。
多数情况下,开发时间比性能更重要。Python有一个很棒的社区,其中有很多很好的库,很多需求在那都能得到满足。
话虽如此,如果想让Python代码更快该怎么做呢?来试试Cython吧!
Cython: Python的C扩展
如果你同时喜欢Python的简单语法以及C的高性能,那么Cython就是你想要的。你可以使用Cython为Python编写C扩展,其代码将转换为优化的C / C ++代码。它可以提供高性能,且能在Python项目中使用。



安装Cython
这需要C编译器,你可以根据自己的操作系统安装一个C编译器,然后需要使用如下命令安装Cython:
pipinstall Cython
从静态类型声明中获益
可以将静态类型声明添加到变量和函数,它将提供更好的性能。你可以将所有C类型如int,float,double等用于声明。
在Cython中声明变量
cdef int i =10
这句命令的基本意思是声明一个变量i,它是一个整数。
在Cython中声明函数
cdef intsquare(int x):    return x ** 2
该命令基本上意味着square函数采用整数x作为参数并返回整数值x ** 2,即x的平方。导入模块时,cdef声明的函数对Python代码不可见。为了使其可见需要改用cpdef。
在Python中计算阶乘
编写一个Python函数来计算给定整数的阶乘:
effactorial(n):                       if  n >=1:                           return n *factorial(n -1)                       return1
使用Cython让Python更快

首先,要创建一个pyx文件。
cpdef longfastfactorial:此函数将返回一个long值,因此我们通过在函数名fastfactorial之前放置long来声明它的类型为long。
long n:我们预期n为long值。
cpdef long fastfactorial(long n):                                if  n >=1:                                    return n * fastfactorial(n-1)                                return1
接着,我们需要创建一个setup.py文件来将Cython转换为C。
from distutils.core import setup                     fromCython.Buildimport cythonize                     setup(ext_modules =cythonize('fastfac.pyx'))
编译代码
为执行编译,需要运行以下命令:
python3setup.py build_ext –inplace
--inplace:此选项会在你的工作目录中创建一个共享对象文件。
对比
让我们比较一下二者:
from fastfac import fastfactorial                   from fac import factorial                   from timeit import timeit                                     print(timeit('fastfactorial(20)', globals=globals(), number=10000))  #output: 0.002164322999306023                   print(timeit('factorial(20)', globals=globals(), number=10000))  #output: 0.18900858898996376
结果惊人,Cython快将近88倍!

只需稍加润色,就可使Python代码的运行速度大幅提高。本文还仅仅只是一个示例,你可以对其进行进一步优化,效果可能会更好!如果大家对Python感兴趣的话,可以加一下我的微信哦:abb436574,免费领取一套学习资料和视频课程哟~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值