Python是数据分析神器。你肯定会遇到性能上的问题,比如一段程序要跑好几个小时,但其实你优化一下程序,就只花几分钟而已。
下面是一些性能优化上的建议:
1.尽可能地减少IO操作
IO操作是非常耗时的,相对于cpu运算来说。一次文件读取,请取出你后面可能用到的最多数据。
2.减少循环的使用
尽可能地在一次循环中多执行些操作。(但并不意味着你把不应该放到循环体内的操作放进来)
典型的场景:一次循环,循环体内执行A;。。。;再一次同样的循环,循环体内执行B
优化:只保留一个循环
3.不要在循环体内进行不必要的操作
操作能放到循环体外,就不要放到循环体内来。
4.优化算法的时间复杂度
慎用指数级复杂度
5.使用python合适的数据结构
set,dict索引(哈希索引)都比list快很多
所以当使用指数级时间复杂度的算法时,可以选择用dict做循环(不使用list)
6.能使用科学计算库或者内置库时,就不要自己写轮子
因为python的科学计算库都是用底层C/C++写的,性能都是很好的。
比如你能使用内置库实现排序,就不要自己用python写个冒泡。
7.循环时,请及时break
8.充分利用 Lazy if-evaluation 的特性
python 中条件表达式是 lazy evaluation 的,也就是说如果存在条件表达式 if x and y
,在 x
为 false
的情况下 y
表达式的值将不再计算。因此可以利用该特性在一定程度上提高程序效率。
9.字符串的优化
python 中的字符串对象是不可改变的,因此对任何字符串的操作如拼接,修改等都将产生一个新的字符串对象,而不是基于原字符串,因此这种持续的 copy 会在一定程度上影响 python 的性能。
字符串连接时使用尽量使用
join()
而不是+
str_list = ['1', '2', '3', '4', '5'] # 方法1(不推荐) string1 = '' for s in str_list: string1 += s print(string1) # 方法2(推荐) string2 = ''.join(str_list) print(string2)
当对字符串既可以使用正则表达式又可以使用内置函数来处理的时候,选择内置函数。内置函数如:
str.isalpha()
,str.isdigit()
,str.startswith(('x', 'yz'))
,str.endswith(('x', 'yz'))
- 对字符(用
%d
%s
等)进行格式化比直接(用+
)串联要快。
10.生成一个列表时,列表解析式比for循环更高效。
在字节码级别,两种方式稍有差别,但是列表解析式的性能是优于for循环的。
11.创建大规模列表(大约有1000以上元素)时,生成器表达式比列表解析式更快;在创建小规模列表(大约有100以下元素)时,列表解析式更快。
注意我们上面说的只是创建列表方面,至于存储、迭代方面,大量元素时生成器表达式依然是很有优势的。
12.map时,使用内置函数
map(operator.add, list1, list2)
比map(lamnda x, y: x+y, list1, list2)
要快。
13.列表需要pop或者insert时,使用队列比使用list好。
14.sort时,尽可能使用key
函数排序,不要使用cmp
函数。
15.while 1
比while True
好
16.多元赋值很慢,除非用它做变量交换,否则就不要使用它
17.链式比较更快
x < y < z
比x<y and y<z
快
18.命名元组替换简单对象
当你需要创建大量简单对象时,可以尝试。
Ref