Python性能优化技巧
作者:hebedich 发布时间:2021-06-29 12:48:32
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++代码,结果是你可以再本机模式下执行应用,而不是依赖于解释器。根据平台和任务中,你可以看到显著的性能提高。


猜你喜欢
- 比如:import linecacheprint linecache.getline('2.1_open.py&
- 前言在面向对象的编程范式中,封装都是必不可少的一个概念,而在诸如 Java,C++等传统的面向对象的语言中, 私有成员是实现封装的一个重要途
- 1、安装virtulenv、virtulenvwrapper包pip install virtualenv virtualenvwrappe
- 如下所示:from urllib.parse import quoteimport stringurl = r'http://www
- 最近这段时间研究Node感觉不错,自己做了一个增删改查,虽然有些简陋,但是思想是想通的,其实所有项目都是增删改查,有助于初学者快速掌握Nod
- 手机控件查看工具uiautomatorviewer工具简介用来扫描和分析Android应用程序的UI控件的工具.如何使用 1.进入
- math模块# 数学相关模块import mathr = math.floor(3.2) # 向下取整print(r)r = math.ce
- 钉钉设置机器人首先在钉钉设置钉钉机器人群设置—> 智能群助手—>添加机器人—>自定义添加完成,得到一个Webhook AP
- 1、MySQL下载1.1下载MySQL8.0.26安装与卸载的完整步骤记录MySQL关是一种关系数据库管理系统,所使用的 SQL 语言是用于
- 用Python+ChatGPT批量生成论文概述做算法研究离不开阅读大量论文。从海量论文中找到需要的论文往往耗费算法团队不少的精力。ChatG
- 链接字典chainMap是逻辑上合并两个字典为一个逻辑单元,合并后的结构实际上是一个列表,只是逻辑上是仍然为一个字典(并未生成新的),对此列
- Django教程Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Djan
- 之前对bottle做过不少的介绍,也写过一些文章来说明bottle的缺点,最近发现其实之前有些地方说的不太公平,所以趁此机会也来更正一下。&
- 对于网站开发者来说,对展示内容增加一个滑动或者是轮播效果的是非常常见的需求。收费和免费的轮播插件多的是不胜枚举。其中很 多提供很多有用的配置
- 目录需求分析进一步分析再进一步分析代码实现我们在写爬虫的过程中,除了研究反爬之外,几乎全部的时间都在写解析逻辑。那么,生命苦短,为什么我们不
- flask-login 模块简介Flask-Login 是一个 Flask 模块,可以为 Flask 应用程序提供用户登录功能。要在 Fla
- 前言WebStorm是一款强大的前端开发软件,vue是当前前端热门技术栈。对于WebStorm默认的配置,它会把vue当成文本文件处理,从而
- 本文记录了mysql 8.0.22 安装配置图文教程,供大家参考,具体内容如下一、安装(1)、官网下载(2)、安装(前提是之前没安装过mys
- 抓取“xmly”鬼故事音频import json # 在这个url,音频链接为JSON动态生成,所以用到了json模块impor
- 1.event.srcElement //srcElement只能在IE下使用target是FireFox使用的,下面是兼容性写法 var