下面是 Python 性能快速优化的第二部分。
- 使用 Map ,Reduce 和 Filter 代替
for 循环
- 校验
a in b
, 字典 或 set 比 列表 或 元组 更好- 当数据量大的时候,尽可能使用不可变数据类型,他们更快 元组 > 列表
- 在一个列表中插入数据的复杂度为 O(n)
- 如果你需要操作列表的两端,使用
deque
- del – 删除对象使用如下 1) python 自己处理它,但确保使用了
gc
模块 2) 编写__del__
函数 3) 最简单的方式,使用后调用del
一.查找的时候,特别是对大文件(大数据)进行查找的时候,用dictionary替代list#-*-coding:utf-8-*- 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'] list = dict.fromkeys(list,True) print list filter = [] for i in range (1000000): for find in ['is','hat','new','list','old','.']: if find not in list: filter.append(find) print "total run time:" print time()-t #2.53629994392 #1.38068699837'''
Python 字典中使用了hash table,因此查找操作的复杂度为 O(1),而 list 实际是个数组,在 list 中,查找需要遍历整个 list,其复杂度为 O(n),
因此对成员的查找访问等操作字典要比 list 更快。
'''
二.涉及到list的交集或者求差等操作的时候,用set替代list
'' from time import time t = time() lista=[1,2,3,4,5,6,7,8,9,13,34,53,42,44] listb=[2,4,6,9,23] intersection=[] for i in range (1000000): list(set(lista)&set(listb)) print "total run time:" print time()-t from time import time ''' t = time() lista = [1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 34, 53, 42, 44] listb = [2, 4, 6, 9, 23] intersection = [] for i in range(1000000): for a in lista: for b in listb: if a == b: intersection.append(a) print "total run time:" print time() - t 用时比较如下所示: #6.26855993271 #1.63295388222
语法 | 操作 | 说明 |
---|---|---|
set(list1) | set(list2) | union | 包含 list1 和 list2 所有数据的新集合 |
set(list1) & set(list2) | intersection | 包含 list1 和 list2 中共同元素的新集合 |
set(list1) - set(list2) | difference | 在 list1 中出现但不在 list2 中出现的元素的集合 |