嫌Python太慢了?让Cython带你飙车吧
很多人仅在性能方面将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,免费领取一套学习资料和视频课程哟~
嫌Python太慢了?让Cython带你飙车吧相关推荐
- 【源代码】Python制作的赛车小游戏,逆行飙车
python制作的赛车小游戏,逆行飙车,通过键盘方向键控制 程序运行截图 源代码 import pygame, sys, time, random# pygame 初始化 pygame.init() ...
- python不想学了-嫌Python太慢但又不想学C/C++?来了解下JIT技术
什么是 JIT Python 是门多才多艺的语言,既可以写后端,也可以做数据分析,既可以智能化运维,也可以搞渗透,既可以写爬虫,又可以做机器学习深度学习.然而,Python 的缺点也很明显,它的速度有 ...
- python 多核并行计算_手把手 | 嫌Python太慢?并行运算Process Pools三行代码给你4倍提速!...
大数据文摘作品,转载要求见文末 作者 | Adam Geitgey 编译 | 元元.Lisa.Saint.Aileen 原文链接 | https://medium.com/@ageitgey/quic ...
- python 多核并行计算_嫌Python太慢?并行运算Process Pools三行代码给你4倍提速!
大数据文摘作品,转载要求见文末,作者 | Adam Geitgey,编译 | 元元.Lisa.Saint.Aileen. Python绝对是处理数据或者把重复任务自动化的绝佳编程语言.要抓取网页日志? ...
- Python制作的赛车小游戏源代码,逆行飙车
python制作的赛车小游戏,逆行飙车,通过键盘方向键控制 程序运行截图: 源代码 import pygame, sys, time, random# pygame 初始化 pygame.init() ...
- python修改文件名称唯美_5行代码搞定14种常见图的python可视化库,还自带16种优美主题,真是太喜欢了...
原创:小dull鸟 python数据分析之禅 原文链接: 5行代码搞定14种常见图的python可视化库,还自带16种优美主题,真是太喜欢了mp.weixin.qq.com 有时候我们做数据可视化并 ...
- 0基础学python培训班_[长文] 学Python不用培训班,一篇文章带你入门
最近有许多小伙伴后台联系我,说目前想要学习Python,但是没有一份很好的资料入门.一方面的确现在市面上Python的资料过多,导致新手会不知如何选择,另一个问题很多资料内容也很杂,从1+1到深度学习 ...
- pythonocr训练模型_cnocr: cnocr是用来做中文OCR的Python 3包。cnocr自带了训练好的识别模型,安装后即可直接使用...
English README. cnocr 使用交流QQ群 欢迎扫码加入QQ交流群: Release Notes Update 2020.04.21: 发布 cnocr V1.1.0 V1.1.0对代 ...
- python中for循环是可以带else的
python中for循环是可以带else的,不满足for循环的条件,可以执行ELSE的内容!#!user/bin/env python #-*-coding:utf-8 -*- # Author: S ...
最新文章
- eclipse问题 - windows版
- Angular2学习笔记——NgModule
- C++语言基础(15)-友元函数和友元类
- C++基于多态实现依赖颠倒原则附源码
- apache的rewrite规则无法加载问题
- Spring的Java配置
- 局域网聊天软件 设计文档怎么写?
- stm32移植freemodbusRTU(HAL库+Freertos)主机
- 理论应用实例水杯_PLC应用,3个PID控制实例讲解,想不会都难!
- Atitit各种驱动的xdd tdd bdd设计 ATDD ddd v3 u66.docx Atitit各种驱动的xdd tdd bdd设计 ATDD ddd v2 s66 开发方法论与效率提
- Fingerprint has already been taken
- 获取任意一个微信小程序码的两种方式
- android studio使用开源项目,gogo电子竞技-gogo电子竞技
- python 对象的销毁_python对象销毁(垃圾回收)
- Tableau可视化项目
- input输入框 去掉外边框 解决方案
- HC-02蓝牙串口模块的配置和使用
- 【AndroidStudio】按钮基本操作(普通按钮、图片按钮、单选按钮设置)(单击事件监听器触发对话框和页面跳转)
- 【iOS】iPhone4 无SHSH备份如何降级至6.1.2版本?
- JAVA完全参考手册(第8版) 第1章至第5章
热门文章
- 互联网晚报 | 1月25日 星期二 | 知乎首次举办上星晚会;微信视频号上线首个付费直播间;淘宝天猫“春节不打烊”活动正式上线...
- 互联网日报 | 新东方二次上市通过港交所聆讯;陌陌宣布任命新CEO;广汽蔚来发致歉声明...
- esxi 6.7 update 3 3b_污水站运维系统,3大要点让你吃透运维本质
- 2017第四届中国国际大数据大会成功召开
- 【数字逻辑设计】Logisim构建三种多路选择器
- Linux服务器---phpMyAdmin
- 域名解析中“TTL”是什么意思?
- IDEA中的HTTP Client Editor测试API
- API设计原则(觉得太合适,转发做记录)
- RHEL账号总结一:账号的分类