python代码优化_Python 代码优化技巧(一)
代码优化Part1
分享最近看到的关于代码优化的一些技巧。
if 判断的短路特性
对于and,应该把满足条件少的放在前面,这样当对于大量判断时, 满足条件少的情况直接回导致其后其他表达式不会计算从而节约时间(因为 False and True 还是 False)import timeit
s1 = """
a = range(2000)
[i for i in a if i % 2 ==0 and i > 1900]
"""
s2 = """
a = range(2000)
[i for i in a if i > 1900 and i % 2 ==0]
"""
print timeit.timeit(stmt=s1, number=1000)
print timeit.timeit(stmt=s2, number=1000)
运行结果如下:➜ python test6.py
0.248532056808
0.195827960968
# 可以看到s2 表达式计算更快, 因为大部分情况都不满足 i>1900, 所以这些情况下, i % 2 == 0 也没有计算,从而节约了时间
同理对于or,把满足条件多的放在前面。import timeit
s1 = """
a = range(2000)
[i for i in a if 10 < i <20 or 1000 < i < 2000]
"""
s2 = """
a = range(2000)
[i for i in a if 1000 < i < 2000 or 10 < i <20]
"""
print timeit.timeit(stmt=s1, number=1000)
print timeit.timeit(stmt=s2, number=1000)
运行结果:0.253124952316
0.202992200851
join 合并字符串
join 合并字符串比循环使用 + 来合并要快。import timeit
s1 = """
a = [str(x) for x in range(2000)]
s = ''
for i in a:
s += i
"""
s2 = """
a = [str(x) for x in range(2000)]
s = ''.join(a)
"""
print timeit.timeit(stmt=s1, number=1000)
print timeit.timeit(stmt=s2, number=1000)
运行结果如下:python test6.py
0.558945894241
0.422435998917
while 1 和 while True
在python2.x里, True 和 False 不是保留的关键字,是一个全局变量,这意味着你可以这样>>> True = 0
>>> True
0
>>> if not True:
... print '1'
...
1
所以下面这两种情况:import timeit
s1 = """
n = 1000000
while 1:
n -= 1
if n <= 0: break
"""
s2 = """
n = 1000000
while True:
n -= 1
if n <= 0: break
"""
print timeit.timeit(stmt=s1, number=100)
print timeit.timeit(stmt=s2, number=100)
运行结果如下:➜ python test6.py
5.18007302284
6.84624099731
因为每次判断 while True 的时候, 先要去找到True的值。
在python3.x里, True 变成了关键字参数,所以上述两种情况就一样了。
cProfile, cStringIO 和 cPickle
使用C语言的版本写的扩展要比原生的要快。cPickle vs pickle 如下:import timeit
s1 = """
import cPickle
import pickle
n = range(10000)
cPickle.dumps(n)
"""
s2 = """
import cPickle
import pickle
n = range(10000)
pickle.dumps(n)
"""
print timeit.timeit(stmt=s1, number=100)
print timeit.timeit(stmt=s2, number=100)
运行结果如下:➜ python test6.py
0.182178974152
1.70917797089
合理使用生成器
区别
使用()得到的是一个generator对象,所需要的内存空间与列表的大小无关,所以效率会高一些。import timeit
s1 = """
[i for i in range (100000)]
"""
s2 = """
(i for i in range(100000))
"""
print timeit.timeit(stmt=s1, number=1000)
print timeit.timeit(stmt=s2, number=1000)
结果:➜ python test6.py
5.44327497482
0.923446893692
但是对于需要循环遍历的情况:使用迭代器效率反而不高,如下:import timeit
s1 = """
ls = range(1000000)
def yield_func(ls):
for i in ls:
yield i+1
for x in yield_func(ls):
pass
"""
s2 = """
ls = range(1000000)
def not_yield_func(ls):
return [i+1 for i in ls]
for x in not_yield_func(ls):
pass
"""
print timeit.timeit(stmt=s1, number=10)
print timeit.timeit(stmt=s2, number=10)
结果如下:➜ python test6.py
1.03186702728
1.01472687721
所以使用生成器是一个权衡的结果,对于内存、速度综合考虑的结果。
xrange
在python2.x里xrange 是纯C实现的生成器,相对于range来说,它不会一次性计算出所有值在内存中。但它的限制是只能和整型一起工作:你不能使用long或者float。
import 语句的开销
import语句有时候为了限制它们的作用范围或者节省初始化时间,被卸载函数内部,虽然python的解释器不会重复import同一个模块不会出错,但重复导入会影响部分性能。
有时候为了实现懒加载(即使用的时候再加载一个开销很大的模块),可以这么做:email = None
def parse_email():
global email
if email is None:
import email
...
# 这样一来email模块仅会被引入一次,在parse_email()被第一次调用的时候。
参考资源:https://wiki.python.org/moin/...
http://blog.csdn.net/zhoudaxi...
https://www.ibm.com/developer...
NEXT ctypes
python代码优化_Python 代码优化技巧(一)相关推荐
- python代码性能优化技巧
python代码性能优化技巧 代码优化能够让程序运行更快,可以提高程序的执行效率等,对于一名软件开发人员来说,如何优化代码,从哪里入手进行优化?这些都是他们十分关心的问题.本文着重讲了如何优化Pyth ...
- Python中相见恨晚的技巧(记得收藏)
话不多说,直接开干,攒了很久! 1. 交换变量值 这个应该比较简单,但是日常用很容易忽略. a, b = 5``, 10 print``(a, b) /``/``5``, 10 a, b = b, a ...
- python画代码-Python教程_Python画Mandelbrot集 代码
Python教程_Python画Mandelbrot集 代码 作者:Comet 来源: 课课家 www.kokojia.com点击数:278发布时间:2015-06-19 11:17:19 曼德勃罗集 ...
- Python的一些小技巧小知识
Chapter 12. HOW-TO 本章内容记录Python的一些小技巧小知识.来源是网上摘录或自己学习所得. 如何判断操作系统类型 import sys print sys.platform pr ...
- 2021-01-20 Python编程特殊小技巧汇集
Python编程特殊小技巧汇集 Python作为一种高级编辑语言,有很多使用的小技巧,分享一期. 1.变量值互换 a = 0b = 1a,b = b, a 2.连续赋值 a, b = 2, 1 3.自 ...
- Excel:python结合Excel使用技巧经验总结之(将python输出的等间隔列数据直接粘贴复制存到物理表格内等)图文教程之详细攻略
Excel:python结合Excel使用技巧经验总结之(将python输出的等间隔列数据直接粘贴复制存到物理表格内等)图文教程之详细攻略 目录 Excel使用技巧经验总结 将pandas.DataF ...
- python列表_Python中列表(list)操作方法汇总
本文实例汇总了Python中关于列表的常用操作方法,供大家参考借鉴.具体方法如下: 一.Python创建列表: sample_list = ['a',1,('a','b')] 二.Python 列表操 ...
- python进阶17炫技巧
原创博客链接:python进阶17炫技巧 原则:可读性第一(效率固然重要,除非非常明显的效率差异,否则可读性优先) 学习炫技巧,更多为了读懂他人代码,自己开发过程中,相似代码量(可读性),建议使用通俗 ...
- 49个Python的常见操作/技巧/例子
17个Python的常见操作/技巧 很多读者都知道 Python 是一种高级编程语言,其设计的核心理念是代码的易读性,以及允许编程者通过若干行代码轻松表达想法创意. 实际上,很多人选择学习 Pytho ...
最新文章
- python处理表格数据-用Python创建/读取/导出表格数据文件
- spring中bean的实例化
- Advanced Transact-SQL for SQL Server 2000 学习译文
- python zipfile 模块下中文乱码 '╡┌╥╗╒┬_╒╨▒Ω╣½╕µ.docx'
- Reuse library debug in Chrome - phase3 exchange drop down list
- python手机端给电脑端发送数据_期货交易软件有哪些比较好用?分手机端和电脑端...
- python中多进程及进程间通信的方法
- 罗佳琪的第三次预备作业——虚拟机的安装及Linux的初步学习
- matlab怎么利用圆形度提取园,基于Matlab+GUI图像处理的物料粒度与圆形度测试.pdf...
- 中国买家团撑起2018芯片市场,华为千亿支出排名全球第三 | 盘点
- python字典示例简单代码_python学习笔记:字典的使用示例详解
- dataframe 绘图——按照每列出一个图(df.plot)
- Palindrome - URAL - 1297(求回文串)
- 24套JAVA企业实战项目教程资源分享
- 计算机应用离散数学,结合计算机应用的离散数学教学研究.pdf
- 证券secuerity英语
- 伦敦城市级MaaS出行服务可行性研究
- 戴尔服务器连接显示器无信号 键盘灯不亮,键盘灯不亮按键没反应怎么回事及解决办法...
- (转)练好太极拳 基本功是必经之路
- html内边距居中,HTML中详述外边距样式属性(margin)与内边距样式属性(padding)...