解决python运行效率不高的问题


Posted in Python onJuly 20, 2020

当我们提到一门编程语言的效率时:通常有两层意思,第一是开发效率,这是对程序员而言,完成编码所需要的时间;另一个是运行效率,这是对计算机而言,完成计算任务所需要的时间。编码效率和运行效率往往是鱼与熊掌的关系,是很难同时兼顾的。不同的语言会有不同的侧重,python语言毫无疑问更在乎编码效率,life is short,we use python。

虽然使用python的编程人员都应该接受其运行效率低的事实,但python在越多越来的领域都有广泛应用,比如科学计算 、web服务器等。程序员当然也希望python能够运算得更快,希望python可以更强大。

首先,python相比其他语言具体有多慢,这个不同场景和测试用例,结果肯定是不一样的。这个网址给出了不同语言在各种case下的性能对比,这一页是python3和C++的对比,下面是两个case:

解决python运行效率不高的问题

从上图可以看出,不同的case,python比C++慢了几倍到几十倍。

python运算效率低,具体是什么原因呢,下列罗列一些:

第一:python是动态语言

一个变量所指向对象的类型在运行时才确定,编译器做不了任何预测,也就无从优化。举一个简单的例子: r = a + b。 a和b相加,但a和b的类型在运行时才知道,对于加法操作,不同的类型有不同的处理,所以每次运行的时候都会去判断a和b的类型,然后执行对应的操作。而在静态语言如C++中,编译的时候就确定了运行时的代码。

另外一个例子是属性查找,关于具体的查找顺序在《python属性查找》中有详细介绍。简而言之,访问对象的某个属性是一个非常复杂的过程,而且通过同一个变量访问到的python对象还都可能不一样(参见Lazy property的例子)。而在C语言中,访问属性用对象的地址加上属性的偏移就可以了。

第二:python是解释执行,但是不支持JIT(just in time compiler)。虽然大名鼎鼎的google曾经尝试Unladen Swallow 这个项目,但最终也折了。

第三:python中一切都是对象,每个对象都需要维护引用计数,增加了额外的工作。

第四:python GIL,GIL是Python最为诟病的一点,因为GIL,python中的多线程并不能真正的并发。如果是在IO bound的业务场景,这个问题并不大,但是在CPU BOUND的场景,这就很致命了。所以笔者在工作中使用python多线程的情况并不多,一般都是使用多进程(pre fork),或者在加上协程。即使在单线程,GIL也会带来很大的性能影响,因为python每执行100个opcode(默认,可以通过sys.setcheckinterval()设置)就会尝试线程的切换,具体的源代码在ceval.c::PyEval_EvalFrameEx。

 第五:垃圾回收,这个可能是所有具有垃圾回收的编程语言的通病。python采用标记和分代的垃圾回收策略,每次垃圾回收的时候都会中断正在执行的程序,造成所谓的顿卡。infoq上有一篇文章,提到禁用Python的GC机制后,Instagram性能提升了10%。感兴趣的读者可以去细读。

内容扩展

关于python运行效率的分析:

如果每次你创建一个应用程序都是用相同的编码方法,几乎肯定会导致一些你的应用程序比它能够达到的运行效率慢的情况。作为分析过程的一部分,你可以尝试一些实验。例如,在一个字典中管理一些元素,你可以采用安全的方法确定元素是否已经存在并更新,或者你可以直接添加元素,然后作为异常处理该元素不存在情况。考虑第一个编码的例子:

n = 16
myDict = {}
for i in range(0, n):
 char = 'abcd'[i%4]
 if char not in myDict:
  myDict[char] = 0
  myDict[char] += 1
  print(myDict)

这段代码通常会在myDict开始为空时运行得更快。然而,当mydict通常被数据填充(或者至少大部分被充填)时,另一种方法效果更好。

n = 16
myDict = {}
for i in range(0, n):
 char = 'abcd'[i%4]
 try:
  myDict[char] += 1
 except KeyError:
  myDict[char] = 1
 print(myDict)

两种情况下具有相同的输出:{‘d': 4, ‘c': 4, ‘b': 4, ‘a': 4}。唯一的不同是这个输出是如何得到的。跳出固定的思维模式,创造新的编码技巧,能够帮助你利用你的应用程序获得更快的结果。

Python 相关文章推荐
python动态性强类型用法实例
May 09 Python
python爬取个性签名的方法
Jun 17 Python
Python TestCase中的断言方法介绍
May 02 Python
详解Python并发编程之创建多线程的几种方法
Aug 23 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
Oct 24 Python
Python values()与itervalues()的用法详解
Nov 27 Python
Django app配置多个数据库代码实例
Dec 17 Python
基于pytorch 预训练的词向量用法详解
Jan 06 Python
tensorflow如何继续训练之前保存的模型实例
Jan 21 Python
python中pyplot基础图标函数整理
Nov 10 Python
Python爬取某平台短视频的方法
Feb 08 Python
python读取excel数据并且画图的实现示例
Feb 08 Python
Python生成器generator原理及用法解析
Jul 20 #Python
Win10环境中如何实现python2和python3并存
Jul 20 #Python
python和go语言的区别是什么
Jul 20 #Python
Python基础教程(一)——Windows搭建开发Python开发环境
Jul 20 #Python
Python字典fromkeys()方法使用代码实例
Jul 20 #Python
Python爬虫设置ip代理过程解析
Jul 20 #Python
Python如何使用27行代码绘制星星图
Jul 20 #Python
You might like
php+mysql实现无限级分类 | 树型显示分类关系
2006/11/19 PHP
php 过滤危险html代码
2009/06/29 PHP
ThinkPHP路由详解
2015/07/27 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
2016/05/16 PHP
PHP函数按引用传递参数及函数可选参数用法示例
2018/06/04 PHP
PHP MVC框架中类的自动加载机制实例分析
2019/09/18 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/06 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
基于Phantomjs生成PDF的实现方法
2016/11/07 Javascript
jQuery删除当前节点元素
2016/12/07 Javascript
ES6新特性七:数组的扩充详解
2017/04/21 Javascript
jQuery实现点击关注和取消功能
2017/07/03 jQuery
关于JavaScript的单双引号嵌套问题
2017/08/20 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
深入浅出es6模板字符串
2017/08/26 Javascript
vue项目中引入noVNC远程桌面的方法
2018/03/05 Javascript
vue-cli 引入、配置axios的方法
2018/05/08 Javascript
vue使用原生js实现滚动页面跟踪导航高亮的示例代码
2018/10/25 Javascript
vue实现条件叠加搜索的解决方法
2019/05/28 Javascript
Python中的is和id用法分析
2015/01/26 Python
python 日志增量抓取实现方法
2018/04/28 Python
python flask实现分页的示例代码
2018/08/02 Python
Python运维开发之psutil库的使用详解
2018/10/18 Python
Python替换月份为英文缩写的实现方法
2019/07/15 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
2020/04/10 Python
css3制作彩色边线3d立体按钮的示例(css3按钮)
2014/05/06 HTML / CSS
后勤自我鉴定
2013/10/13 职场文书
人力资源管理毕业生自荐信
2013/11/21 职场文书
优秀体育委员自荐书
2014/01/31 职场文书
食品安全承诺书
2014/05/22 职场文书
2015年学校禁毒工作总结
2015/05/27 职场文书
少年犯观后感
2015/06/11 职场文书
七一晚会主持词
2015/06/29 职场文书
css3 选择器
2022/05/11 HTML / CSS