关于python性能提升的一些方案(上)
一、函数调用优化(空间跨度,避免访问内存)
1.大数据求和,使用sum
a = range(100000)
%timeit -n 10 sum(a)
10 loops, best of 3: 3.15 ms per loop
%%timeit
...: s = 0
...: for i in a:
...: s += i
...:
100 loops, best of 3: 6.93 ms per loop
2.小数据求和,避免使用sum
%timeit -n 1000 s = a + b + c + d + e + f + g + h + i + j + k # 数据量较小时直接累加更快
1000 loops, best of 3: 571 ns per loop
%timeit -n 1000 s = sum([a,b,c,d,e,f,g,h,i,j,k]) # 小数据量调用 sum 函数,空间效率降低
1000 loops, best of 3: 669 ns per loop
结论:大数据求和sum效率高,小数据求和直接累加效率高。
二、for循环优化之取元素(使用栈或寄存器,避免访问内存)
for lst in [(1, 2, 3), (4, 5, 6)]: # lst 索引需要额外开销
pass
应尽量避免使用索引。
for a, b, c in [(1, 2, 3), (4, 5, 6)]: # better
pass
相当于给每一个元素直接赋值。
def force():
lst = range(4)
for a1 in [1, 2]:
for a2 in lst:
for a3 in lst:
for b1 in lst:
for b2 in lst:
for b3 in lst:
for c1 in lst:
for c2 in lst:
for c3 in lst:
for d1 in lst:
yield (a1, a2, a3, b1, b2, b3, c1, c2, c3, d1) %%timeit -n 10
for t in force():
sum([t[0], t[1], t[2], t[3], t[4], t[5], t[6], t[7], t[8], t[9]])
10 loops, best of 3: 465 ms per loop
%%timeit -n 10
for a1, a2, a3, b1, b2, b3, c1, c2, c3, d1 in force():
sum([a1, a2, a3, b1, b2, b3, c1, c2, c3, d1])
10 loops, best of 3: 360 ms per loop
三、生成器优化(查表代替运算)
def force(start, end): # 用于密码暴力破解程序
for i in range(start, end):
now = i
sublst = []
for j in range(10):
sublst.append(i % 10) # 除法运算开销较大,比乘法大
i //= 10
sublst.reverse()
yield(tuple(sublst), now)
def force(): # better
lst = range(5)
for a1 in [1]:
for a2 in lst:
for a3 in lst:
for b1 in lst:
for b2 in lst:
for b3 in lst:
for c1 in lst:
for c2 in lst:
for c3 in lst:
for d1 in lst:
yield (a1, a2, a3, b1, b2, b3, c1, c2, c3, d1)
r0 = [1, 2] # 可读性与灵活性
r1 = range(10)
r2 = r3 = r4 = r5 = r6 = r7 = r8 = r9 = r1
force = ((a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)
for a0 in r0 for a1 in r1 for a2 in r2 for a3 in r3 for a4 in r4
for a5 in r5 for a6 in r6 for a7 in r7 for a8 in r8 for a9 in r9)
四、幂运算优化(pow(x,y,z))
def isprime(n):
if n & 1 == 0:
return False
k, q = find_kq(n)
a = randint(1, n - 1)
if pow(a, q, n) == 1: # 比使用 a ** q % n 运算优化数倍
return True
for j in range(k):
if pow(a, pow(2, j) * q, n) == n - 1: # a **((2 ** j) * q) % n
return True
return False
结论:pow(x,y,z)优于x**y%z.
五、除法运算优化
In [1]: from random import getrandbits In [2]: x = getrandbits(4096) In [3]: y = getrandbits(2048) In [4]: %timeit -n 10000 q, r = divmod(x, y)
10000 loops, best of 3: 10.7 us per loop In [5]: %timeit -n 10000 q, r = x//y, x % y
10000 loops, best of 3: 21.2 us per loop
结论:divmod优于//和%。
六、优化算法时间复杂度
算法的时间复杂度对程序的执行效率影响最大,在python中可以选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的时间复杂度分别是O(n)和O(1)。不同场景有不同的优化方式,总的来说,一般有分治,分支定界、贪心动态规划等思想。
七、合理使用copy和deepcopy
对于dict和list等数据结构的对象,直接赋值使用的是引用的方式。而有些情况下需要复制整个对象,这时可以使用copy包里的copy和deepcopy,这两个函数的不同之处在于deepcopy是递归复制的。效率不同:
In [23]: import copy
In [24]: %timeit -n 10 copy.copy(a)
10 loops, best of 3: 606 ns per loop
In [25]: %timeit -n 10 copy.deepcopy(a)
10 loops, best of 3: 1.17 us per loop
timeit后面的-n表示运行的次数,后两行对应的是两个timeit的输出,下同。由此可见后者慢一个数量级。
关于copy的一个例子:
>>> lists = [[]] * 3
>>> lists
[[], [], []]
>>> lists[0].append(3)
>>> lists
[[3], [3], [3]]
发生的事情是这样的,[[]]是包含一个空列表的只有一个元素的列表,所以[[]] * 3的所有三个元素都是(指向)这个空列表。修改lists的任何元素都修改这个列表。修改效率高。
八、使用dict或set查找元素
python 字典和集合都是使用hash表来实现(类似c++标准库unordered_map),查找元素的时间复杂度是O(1)。
In [1]: r = range(10**7)
In [2]: s = set(r) # 占用 588MB 内存
In [3]: d = dict((i, 1) for i in r) # 占用 716MB 内存
In [4]: %timeit -n 10000 (10**7) - 1 in r
10000 loops, best of 3: 291 ns per loop
In [5]: %timeit -n 10000 (10**7) - 1 in s
10000 loops, best of 3: 121 ns per loop
In [6]: %timeit -n 10000 (10**7) - 1 in d
10000 loops, best of 3: 111 ns per loop
结论:set 的内存占用量最小,dict运行时间最短。
九、合理使用(generator)和yield(节省内存)
In [1]: %timeit -n 10 a = (i for i in range(10**7)) # 生成器通常遍历更高效
10 loops, best of 3: 933 ns per loop
In [2]: %timeit -n 10 a = [i for i in range(10**7)]
10 loops, best of 3: 916 ms per loop
In [1]: %timeit -n 10 for x in (i for i in range(10**7)): pass
10 loops, best of 3: 749 ms per loop
In [2]: %timeit -n 10 for x in [i for i in range(10**7)]: pass
10 loops, best of 3: 1.05 s per loop
结论:尽量使用生成器去遍历。
关于python性能提升的一些方案(上)的更多相关文章
- Python性能提升小技巧
第一部分 1-使用内建函数: 你可以用Python写出高效的代码,但很难击败内建函数. 经查证. 他们非常快速 2-使用 join() 连接字符串. 你可以使用 + 来连接字符串. 但由于string ...
- Web 应用性能提升 10 倍的 10 个建议
转载自http://blog.jobbole.com/94962/ 提升 Web 应用的性能变得越来越重要.线上经济活动的份额持续增长,当前发达世界中 5 % 的经济发生在互联网上(查看下面资源的统计 ...
- VNF网络性能提升解决方案及实践
VNF网络性能提升解决方案及实践 2016年7月 作者: 王智民 贡献者: 创建时间: 2016-7-20 稳定程度: 初稿 修改历史 版本 日期 修订人 说明 1.0 20 ...
- Web 应用性能提升的 10 个建议
建议一.利用反向代理服务器加速和保护应用 如果 Web 应用运行在一台独立的电脑上,性能问题的解决方案是显而易见的:换一台更快的电脑,里面加上更多的处理器.内存.快速磁盘阵列等等.然后在这台新电脑上运 ...
- Python几种并发实现方案的性能比较
http://blog.csdn.net/permike/article/details/54846831 Python几种并发实现方案的性能比较 2017-02-03 14:33 1541人阅读 评 ...
- 禁用 Python GC,Instagram 性能提升10%
通过关闭 Python 垃圾收集(GC)机制,该机制通过收集和释放未使用的数据来回收内存,Instagram 的运行效率提高了 10 %.是的,你没听错!通过禁用 GC,我们可以减少内存占用并提高 C ...
- Python性能优化方案
Python性能优化方案 从编码方面入手,代码算法优化,如多重条件判断有限判断先决条件(可看 <改进python的91个建议>) 使用Cython (核心算法, 对性能要求较大的建议使用C ...
- 在PYTHON中使用StringIO的性能提升实测(更新list-join对比)
刚开始学习PYTHON,感觉到这个语言真的是很好用,可以快速完成功能实现. 最近试着用它完成工作中的一个任务:在Linux服务器中完成对.xml.gz文件的解析,生成.csv文件,以供SqlServe ...
- Atitit.h5 web webview性能提升解决方案-----fileStrore缓存离线存储+http方案
Atitit.h5 web webview性能提升解决方案-----fileStrore缓存离线存储+http方案 1. 业务场景 android+webview h5 css背景图性能提升1 2. ...
随机推荐
- SVN迁移到Git的过程(+ 一些技巧)
SVN迁移到Git的过程(+ 一些技巧) 李顺利 Key Words SVN,Git,Clone,Conversion,Tips,VCS,Pro Git 关于在VCS中SVN和Git之间的迁移(Clo ...
- PyCharm 5 破解注册方法
方法: 调整时间到2038年. 申请30天试用 退出pycharm 时间调整回来即可. 或者: 注册时选择 License server ,填 http://idea.lanyus.com ,然后点击 ...
- Unity3d《Shader篇》漫反射
Unity3d<Shader篇>漫反射 Shader "Custom/Ambient" { Properties { _MainTex ("Base (RGB ...
- C# 中的virtural和abstract
一. Virtual 方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual 的使用有两种情况: 1.在基类中定义了virtual方法,但是派生类中没有重写该虚方法,那么在对派生类 ...
- ios awakeFromNib 和 initWithCoder:
During the instantiation process, each object in the archive is unarchived and then initialized with ...
- perl运行其他程序的5种方法
1.使用system函数 运行成功,返回0,运行失败则返回非负整数 system("cmd"); 2.使用qx my $cmd1=qx/date/; 3.使用`` 与qx等效 4. ...
- Struts2常用标签
Struts2常用标签总结 一 介绍 1.Struts2的作用 Struts2标签库提供了主题.模板支持,极大地简化了视图页面的编写,而且,struts2的主题.模板都提供了很好的扩展性.实现了更好的 ...
- Django~queries
API queries create, retrieve, update and delete
- Django环境搭建
1.安装好Python 2.7.10 2.下载解压Django Django-1.9.2.tar.gz cmd cd到解压缩目录(***) python setup.py install 3.检测是否 ...
- ASM:《X86汇编语言-从实模式到保护模式》1-4章:处理器,内存和硬盘基础
其实很久之前就学完了实模式了,但是一直没有总结,感觉现在直接在书上做笔记的弊端就是有些知识点不能很很深刻地记下来(毕竟手写最明显的优点就是能深刻地记住知识,但是就是用太多的时间罢了).一下内容都是一些 ...