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

开发 后端
多数情况下,开发时间比性能更重要。Python有一个很棒的社区,其中有很多很好的库,很多需求在那都能得到满足。话虽如此,如果想让Python代码更快该怎么做呢?来试试Cython吧!

本文转载自公众号“读芯术”(ID:AI_Discovery)

很多人仅在性能方面将Python与C进行了比较,没有在快速开发方面比较,就开始抱怨Python太慢了。Python的优点在于,其开发时间非常短,你不必处理指针、内存管理等问题。

多数情况下,开发时间比性能更重要。Python有一个很棒的社区,其中有很多很好的库,很多需求在那都能得到满足。

话虽如此,如果想让Python代码更快该怎么做呢?来试试Cython吧!

Cython: Python的C扩展

如果你同时喜欢Python的简单语法以及C的高性能,那么Cython就是你想要的。你可以使用Cython为Python编写C扩展,其代码将转换为优化的C / C ++代码。它可以提供高性能,且能在Python项目中使用。

 

[[329476]]

 

 

图源:morioh

 

安装Cython

这需要C编译器,你可以根据自己的操作系统安装一个C编译器,然后需要使用如下命令安装Cython:

  1. pipinstall Cython 

从静态类型声明中获益

可以将静态类型声明添加到变量和函数,它将提供更好的性能。你可以将所有C类型如int,float,double等用于声明。

在Cython中声明变量

  1. cdef int i =10 

这句命令的基本意思是声明一个变量i,它是一个整数。

在Cython中声明函数

  1. cdef intsquare(int x): 
  2.     return x ** 2 

该命令基本上意味着square函数采用整数x作为参数并返回整数值x ** 2,即x的平方。导入模块时,cdef声明的函数对Python代码不可见。为了使其可见需要改用cpdef。

在Python中计算阶乘

编写一个Python函数来计算给定整数的阶乘:

  1. effactorial(n): 
  2.                        if  n >=1: 
  3.                            return n *factorial(n -1) 
  4.                        return1 

使用Cython让Python更快

 

[[329477]]

 

 

图源:unsplash

 

首先,要创建一个pyx文件。

cpdef longfastfactorial:此函数将返回一个long值,因此我们通过在函数名fastfactorial之前放置long来声明它的类型为long。

long n:我们预期n为long值。

  1. cpdef long fastfactorial(long n): 
  2.                                 if  n >=1: 
  3.                                     return n * fastfactorial(n-1) 
  4.                                 return1 

接着,我们需要创建一个setup.py文件来将Cython转换为C。

  1. from distutils.core import setup 
  2.                      fromCython.Buildimport cythonize 
  3.                      setup(ext_modules =cythonize('fastfac.pyx')) 

编译代码

为执行编译,需要运行以下命令:

  1. python3setup.py build_ext –inplace 

--inplace:此选项会在你的工作目录中创建一个共享对象文件。

对比

让我们比较一下二者:

  1. from fastfac import fastfactorial 
  2.                    from fac import factorial 
  3.                    from timeit import timeit 
  4.                    
  5.                    print(timeit('fastfactorial(20)', globalsglobals=globals(), number=10000))  #output: 0.002164322999306023 
  6.                    print(timeit('factorial(20)', globalsglobals=globals(), number=10000))  #output: 0.18900858898996376 

结果惊人,Cython快将近88倍!

 

 

[[329478]]

 

 

图源:unsplash

 

只需稍加润色,就可使Python代码的运行速度大幅提高。本文还仅仅只是一个示例,你可以对其进行进一步优化,效果可能会更好!

 

责任编辑:赵宁宁 来源: 读芯术
相关推荐

2023-12-07 19:13:48

Pythonprint

2018-02-25 09:12:15

PythonC语言代码

2015-08-04 10:34:13

Windows 10升级

2017-08-31 13:50:53

Python编程语言

2022-06-17 11:10:43

PandasPolarsPython

2023-09-02 20:13:01

代码网速

2022-01-06 08:34:32

数据库Spark查询

2009-02-10 09:34:00

2020-07-23 14:15:42

Cython的Python代码

2012-12-11 09:48:55

广域网网络优化网络加速

2019-09-02 08:58:27

Python编译器编程语言

2019-05-16 14:50:32

CythonPython编程语言

2020-01-08 10:47:51

硬盘内存网络

2009-11-17 14:13:41

PythonGoogle

2011-03-31 09:26:15

MySQL扩展性精简

2018-02-24 08:54:41

2011-01-06 10:46:10

微软认证

2018-11-27 15:55:21

TCP通讯协议

2015-06-05 09:38:51

2016-10-10 08:38:40

Windows 10备份格式化
点赞
收藏

51CTO技术栈公众号