python 性能优化
1、优化循环
循环之外能做的事不要放在循环内,比如下面的优化可以快一倍
2、使用join合并迭代器中的字符串
join
对于累加的方式,有大约5倍的提升
3、使用if is
使用if is True
比if == True
将近快一倍
4、使用级联比较x < y < z
x < y < z
效率略高,而且可读性更好
5、使用**
而不是pow
%timeit -n 10000 c = pow(2,20)
%timeit -n 10000 c = 2**20
10000 loops, best of 3: 284 ns per loop
10000 loops, best of 3: 16.9 ns per loop
**
就是快10倍以上!
6、优化包含多个判断表达式的顺序
对于and,应该把满足条件少的放在前面,对于or,把满足条件多的放在前面
a = range(2000)
%timeit -n 100 [i for i in a if 10 < i < 20 or 1000 < i < 2000]
%timeit -n 100 [i for i in a if 1000 < i < 2000 or 100 < i < 20]
%timeit -n 100 [i for i in a if i % 2 == 0 and i > 1900]
%timeit -n 100 [i for i in a if i > 1900 and i % 2 == 0]
100 loops, best of 3: 287 µs per loop
100 loops, best of 3: 214 µs per loop
100 loops, best of 3: 128 µs per loop
100 loops, best of 3: 56.1 µs per loop
7、使用dict或set查找元素
python dict和set都是使用hash表来实现,查找元素的时间复杂度是O(1)
8、合理使用copy与deepcopy
对于dict和list等数据结构的对象,直接赋值使用的是引用的方式。而有些情况下需要复制整个对象,这时可以使用copy包里的copy和deepcopy,
这两个函数的不同之处在于后者是递归复制的。效率也不一样:(以下程序在ipython中运行)
import copy
a = range(100000)
%timeit -n 10 copy.copy(a) # 运行10次 copy.copy(a)
%timeit -n 10 copy.deepcopy(a)
10 loops, best of 3: 1.55 ms per loop
10 loops, best of 3: 151 ms per loop
9、使用列表解析和生成器表达式
表解析要比在循环中重新构建一个新的 list 更为高效,因此我们可以利用这一特性来提高运行的效率。
from time import time
t = time()
list = ['a','b','is','python','jason','hello','hill','with','phone','test',
'dfdf','apple','pddf','ind','basic','none','baecr','var','bana','dd','wrd']
total=[]
for i in range (1000000):
for w in list:
total.append(w)
print "total run time:"
print time()-t
使用列表解析:
- for i in range (1000000):
- a = [w for w in list]
上述代码直接运行大概需要 17s,而改为使用列表解析后 ,运行时间缩短为 9.29s。将近提高了一半。生成器表达式则是在 2.4 中引入的新内容,语法和列表解析类似,但是在大数据量处理时,生成器表达式的优势较为明显,它并不创建一个列表,只是返回一个生成器,因此效率较高。在上述例子上中代码 a = [w for w in list] 修改为 a = (w for w in list),运行时间进一步减少,缩短约为 2.98s。
10、使用xrange代替range
在循环的时候使用 xrange 而不是 range;使用 xrange 可以节省大量的系统内存,因为 xrange() 在序列中每次调用只产生一个整数元素。而 range() 將直接返回完整的元素列表,用于循环时会有不必要的开销。在 python3 中 xrange 不再存在,里面 range 提供一个可以遍历任意长度的范围的 iterator。
11、使用局部变量
使用局部变量,避免”global” 关键字。python 访问局部变量会比全局变量要快得多,因 此可以利用这一特性提升性能
12、使用is not
if done is not None 比语句 if done != None 更快
13、while 1要比while Trule更快
很多Python优化的文章,都会谈及这个。那么,到底能提高多少呢?我们来试试看
import random
import time start_time = time.time()
print start_time j = 1
while True:
j += 1
end_time = time.time()
if end_time - start_time >= 1 :
break
print j
print end_time print "======== split =========="
start_time = time.time()
print start_time j = 1
while 1:
j += 1
end_time = time.time()
if end_time - start_time >= 1 :
break
print j
print end_time
输出结果:
1399342863.16
2573550
1399342864.16
======== split ==========
1399342864.18
2973070
1399342865.18
一个是25万,一个是29万。大约提升了16%左右的性能。其实不是很明显。只是聊胜于无。
14、使用内置函数更快,如add(a,b)要快于a+b
15、如果需要交换两个变量的值使用 a,b=b,a 而不是借助中间变量 t=a;a=b;b=t;
16、生成序列
用range()函数生成序列,与自定义序列
(1)a = range(0,6)
(2)a = [0, 1, 2, 3, 4, 5]
分别测试了一下,结果如下:
loop_num: 1029877
loop_num: 1602341
结论:还是自己显式定义序列,效率更高。
17、生成序列副本
生成一个序列的副本:用copy,与用切片特性
a = [0, 1, 2, 3, 4, 5]
(1)b = copy.copy(a)
(2)b = a[:]
分别测试了一下,结果如下:
loop_num: 677838
loop_num: 1530012
结论:变通的切片应用作为拷贝,比浅拷贝函数效率更高。注意,深拷贝效率很低!
18、慎用python内置函数
python内置函数,只是为了应对通用情况。在很多情况下,内置函数的性能,远远不如自己写的,有针对性的函数。动动手,换个算法,就能把性能提高一倍以上。
19、选择合适的格式化字符方式
s1, s2 = 'ax', 'bx' %timeit -n 100000 'abc%s%s' % (s1, s2)
%timeit -n 100000 'abc{0}{1}'.format(s1, s2)
%timeit -n 100000 'abc' + s1 + s2 100000 loops, best of 3: 183 ns per loop 100000 loops, best of 3: 169 ns per loop 100000 loops, best of 3: 103 ns per loop
三种情况中,%的方式是最慢的,但是三者的差距并不大(都非常快)。(个人觉得%的可读性最好)
20、合理使用del
用del可以将对象占用内存空间的引用计数值置零(Deletion of a name removes the binding of that name from the local or global namespace)。它并不能让对象占用的内存被回收,但一段内存的引用计数变为零,就说明它可以再次被重新使用了(所以del后,不必要GC介入)。
如果不用del,下面这段代码就可能MemoryError
import numpy as np matrix1 = np.zeros((60000,100000))
matrix2 = np.zeros((60000,100000))
# using matrix1
# using matrix2
利用del,可以将用完后没必要占用内存的对象删掉,下面的代码对内存耗费就没上面的大。
import numpy as np matrix1 = np.zeros((60000,100000))
# using matrix1
del matrix1 matrix2 = np.zeros((60000,100000))
# using matrix2
del matrix2
python 性能优化的更多相关文章
- Python性能优化(转)
分成两部分:代码优化和工具优化 原文:http://my.oschina.net/xianggao/blog/102600 阅读 Zen of Python,在Python解析器中输入 import ...
- Python性能优化方案
Python性能优化方案 从编码方面入手,代码算法优化,如多重条件判断有限判断先决条件(可看 <改进python的91个建议>) 使用Cython (核心算法, 对性能要求较大的建议使用C ...
- python性能优化
注意:本文除非特殊指明,”python“都是代表CPython,即C语言实现的标准python,且本文所讨论的是版本为2.7的CPython. python为什么性能差: 当我们提到一门编程语言的 ...
- Python性能优化:PyPy、Numba 与 Cython。PyPy的安装及对应pip的安装
性能优化讨论见参考1:大概意思是,PyPy内置JIT,对纯Python项目兼容性极好,几乎可以直接运行并直接获得性能提升:缺点是对很多C语言库支持性不好.Numba是一个库,可以在运行时将Python ...
- Python性能优化的20条建议 (转载)
优化算法时间复杂度 算法的时间复杂度对程序的执行效率影响最大,在Python中可以通过选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的时间复杂度分别是O(n)和O(1).不同的场 ...
- python基础===Python性能优化的20条建议
优化算法时间复杂度 算法的时间复杂度对程序的执行效率影响最大,在Python中可以通过选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的时间复杂度分别是O(n)和O(1).不同的场 ...
- python性能优化建议
参考: https://segmentfault.com/a/1190000000666603 http://blog.csdn.net/zhoudaxia/article/details/23853 ...
- Python性能优化的20条建议
优化算法时间复杂度 算法的时间复杂度对程序的执行效率影响最大,在Python中可以通过选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的时间复杂度分别是O(n)和O(1).不同的场 ...
- python性能优化、内存优化、内存泄露;与其他语音比较效率如何?
1.内存泄露:http://www.cnblogs.com/xybaby/p/7491656.html 2.内存优化:http://www.cnblogs.com/xybaby/p/7488216.h ...
随机推荐
- pyqt labe界面超级链接例子学习
def bz(self): self.lable1=QtGui.QLabel(u'<br><a href=http://windows.microsoft.com/zh-cn/win ...
- Promise 异步执行的同步操作
Promise 是用来执行异步操作的. 但有时一个异步操作需要等其他的异步操作完成,这时候就可以使用then来做. function loadImageAsync(url) { return new ...
- PC--CSS命名
头:header内 容:container尾:footer导航:nav侧栏:sidebar栏目:column页 面外围控制整体布局宽度:wrapper左右中:left right center登录条: ...
- SqlDependency不起作用
今天使用SqlDependency,结果不起作用,失效,不管数据库怎么修改,这边都没反应,OnChange事件总是不执行,很奇怪.我打开msdn里的例子,代码复制出来,结果没问题,能执行,那剩下来的问 ...
- Linux自动登陆的设置方法
前些天为了实现Linux自动登陆的方法,在网上查了很多资料,发现有不少方法,但网上有些方法的讲解不是特别清楚,或者已经过时.因此,特意整理了一下Linux自动登陆的设置方法.本文的测试环境为Cento ...
- SQL语句中的DQL、DML、DCL、DDL、CCL、TPL
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统:同时也是数据库 ...
- nodejs报错 events.js:72 throw er; // Unhandled 'error' event
var http = require('http'); var handlerRequest = function(req,res){ res.end('hello');}; var webServe ...
- Global.asax使用2
ASP.NET中利用Application和Session统计在线人数.历史访问量 先来简单说一下ASP.NET中的Application和Session 下图是我们非常熟悉的Web应用程序的结构: ...
- LinearLayout使用简单实例
1.代码 import android.annotation.SuppressLint; import android.app.Activity; import android.app.ActionB ...
- C#参数传递、引用类型、值类型等的理解
本博客不属于技术贴,主要是记录一些自己对不懂得地方的理解和学习的记录,请带着批判的眼光阅读~ 值类型存储在栈上,引用类型存储在堆上.栈是由高到低存储的,遵循先进后出的原则,是内存提前分配好的区域,内存 ...