Python性能优化技巧


Posted in Python onMarch 09, 2015

Python是一门非常酷的语言,因为很少的Python代码可以在短时间内做很多事情,并且,Python很容易就能支持多任务和多重处理。

py

  1、关键代码可以依赖于扩展包

Python使许多编程任务变得简单,但是对于很关键的任务并不总是提供最好的性能。使用C、C++或者机器语言扩展包来执行关键任务能极大改善性能。这些包是依赖于平台的,也就是说,你必须使用特定的、与你使用的平台相关的包。简而言之,该解决方案提供了一些应用程序的可移植性,以换取性能,您可以获得只有通过直接向底层主机编程。下面这些扩展包你可以考虑添加到你的个人扩展库中:

Cython
PyInlne
PyPy
Pyrex

这些包有不同的作用和执行方式。例如,Pyrex 让Python处理一些内存任务变得简单高效;PyInline可以直接让你在Python应用程序中使用C代码,虽然内联代码被单独编译,但是如果你能高效的利用C代码,它可以在同一个地方处理每一件事情。

  2、使用关键字排序

有很多古老的Python代码在执行时将花费额外的时间去创建一个自定义的排序函数。最好的排序方式是使用关键字和默认的sort()方法,看看下面的示例:

import operator

somelist = [(1, 5, 8), (6, 2, 4), (9, 7, 5)]

somelist.sort(key=operator.itemgetter(0))

somelist

#Output = [(1, 5, 8), (6, 2, 4), (9, 7, 5)]

somelist.sort(key=operator.itemgetter(1))

somelist

#Output = [(6, 2, 4), (1, 5, 8), (9, 7, 5)]

somelist.sort(key=operator.itemgetter(2))

somelist

#Output = [(6, 2, 4), (9, 7, 5), (1, 5, 8)],

每一个案例的列表是根据你选择作为关键字参数的索引排序的,这种方式对字符串和数字排序同样适用。

  3、优化循环

每一种编程语言都强调循环语句的优化,Python也是一样的。尽管你可以依赖于丰富的技术让循环运行的更快,然而,开发者经常忽略的一个方法是避免在循环内部使用点拼接字符串。对于下面的示例:

lowerlist = ['this', 'is', 'lowercase']

upper = str.upper

upperlist = []

append = upperlist.append

for word in lowerlist:

    append(upper(word))

    print(upperlist)

    #Output = ['THIS', 'IS', 'LOWERCASE']

每一次调用str.upper,Python都会去求这个方法的值。但是如果你把求值的结果放入一个变量中,就能提高程序的性能。这个关键是减少Python内执行的循环次数,因为Python解析这些实例是比较慢的。

  4、使用新版本

任何一个在线上搜索Python资料的人都会发现无数关于Python版本迁移的信息。通常,Python每一个版本都针对之前的一个版本做了优化和改进,以让Python运行的更快。限制因素是你喜欢的函数库是否也针对Python的新版本做了改进。

当你使用了新的函数库,获得了Python的新版本,你需要保证代码依然能够运行,检查应用,修正差异。

然后,如果你仅仅是保证应用能够在新版本上运行,你可能错过新功能的更新。一旦你做了改进,在新版本下配置应用程序,检查问题区域并优先使用新功能更新,对于之前的升级,用户将看到更大性能的提升。

  5、尝试多种编程方法

每一次你创建应用的时候,都使用同一种编程方法,在某些情况下降导致程序运行会比预期的慢。在分析的过程中做一些小试验。例如,当管理字典中的数据项时,可以采用安全的方法确定数据项是否已经存在并需要更新它,或者你可以直接添加条目,然后处理项目根本不存在的情况。

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},唯一的差异是输出是怎么获得的。站在盒子外考虑和创建新的编程技巧都能让你的程序获得更快的运行速度。

  6、交叉编译程序

        开发者有时会忘记计算机不能识别任何一种现在应用程序语言,它只识别机器代码。为了运行程序,需要一个应用将人类可读的代码转换成计算机能识别的代码。当用一种语言写程序时,例如Python,然后用另外一种语言来运行它,例如C++,从性能角度看是有道理的。这个取决于你想要用这个应用做什么和主机系统能够提供什么资源。

        一个有趣的交叉编译器,Nuitka, 能将Python转换成C++代码,结果是你可以再本机模式下执行应用,而不是依赖于解释器。根据平台和任务中,你可以看到显著的性能提高。

以上就是本文的全部内容了,希望对大家学习Python有所帮助。

Python 相关文章推荐
复制粘贴功能的Python程序
Apr 04 Python
python回溯法实现数组全排列输出实例分析
Mar 17 Python
python采用django框架实现支付宝即时到帐接口
May 17 Python
Python判断两个对象相等的原理
Dec 12 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
Jun 19 Python
python实现共轭梯度法
Jul 03 Python
Django使用Jinja2模板引擎的示例代码
Aug 09 Python
Python解析多帧dicom数据详解
Jan 13 Python
Python操作dict时避免出现KeyError的几种解决方法
Sep 20 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
Nov 24 Python
Python读取pdf表格写入excel的方法
Jan 22 Python
Python通过loop.run_in_executor执行同步代码 同步变为异步
Apr 11 Python
Python中的赋值、浅拷贝、深拷贝介绍
Mar 09 #Python
Python自动连接ssh的方法
Mar 07 #Python
Python最长公共子串算法实例
Mar 07 #Python
Python复制目录结构脚本代码分享
Mar 06 #Python
python获取android设备的GPS信息脚本分享
Mar 06 #Python
Python写的英文字符大小写转换代码示例
Mar 06 #Python
Python脚本实现集群检测和管理功能
Mar 06 #Python
You might like
php中取得URL的根域名的代码
2011/03/23 PHP
php遍历所有文件及文件夹的方法深入解析
2013/06/08 PHP
php实现购物车功能(以大苹果购物网为例)
2017/03/09 PHP
ThinkPHP5 验证器的具体使用
2018/05/31 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
PHP文件操作简单介绍及函数汇总
2020/12/11 PHP
用JQuery 实现的自定义对话框
2007/03/24 Javascript
为jQuery.Treeview添加右键菜单的实现代码
2010/10/22 Javascript
更优雅的事件触发兼容
2011/10/24 Javascript
js 高效去除数组重复元素示例代码
2013/12/19 Javascript
原生javascript实现图片按钮切换
2015/01/12 Javascript
jQuery语法小结(超实用)
2015/12/31 Javascript
深入理解JS DOM事件机制
2016/08/06 Javascript
PhotoSwipe异步动态加载图片方法
2016/08/25 Javascript
深入学习js瀑布流布局
2016/10/14 Javascript
js css3实现图片拖拽效果
2017/03/04 Javascript
Vue 换肤的示例实践
2018/01/23 Javascript
vue-cli3 从搭建到优化的详细步骤
2019/01/20 Javascript
详解nodejs 开发企业微信第三方应用入门教程
2019/03/12 NodeJs
一文快速详解前端框架 Vue 最强大的功能
2019/05/21 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
2020/02/06 Javascript
[40:03]RNG vs VG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
玩转python爬虫之URLError异常处理
2016/02/17 Python
opencv与numpy的图像基本操作
2019/03/08 Python
Window系统下Python如何安装OpenCV库
2020/03/05 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
2020/03/23 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
德国大型和小型家用电器网上商店:Energeto
2019/05/15 全球购物
英国奢华护肤、美容和Spa品牌:Temple Spa
2019/11/02 全球购物
ECCO俄罗斯官网:北欧丹麦鞋履及皮具品牌
2020/06/26 全球购物
2014最新党员批评与自我批评材料
2014/09/24 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
运动会广播稿50字-100字
2014/10/11 职场文书
新郎新娘答谢词
2015/01/04 职场文书
Python 装饰器(decorator)常用的创建方式及解析
2022/04/24 Python