1、选择合适的数据结构
python中有四种内置的数据结构,分别是列表List、元组Tuple、集合Set、字典Dict
其中大多数开发人员在所有情况下都是使用列表,这是不正确的,应该针对不同的任务使用合适的数据结构。
2、善于使用python强大的内置函数和第三方库
多个if else条件判断时,可以把最有可能先发生的条件放在前面,这样可以减少程序判断的次数,提高效率
常用的内置函数sum()、len()、map()、max()、join()等
3、使用多进程、多线程
4、少用循环,可以用列表推导式、迭代器、filter()等代替循环,减少循环次数,精确控制,不浪费CPU
## 返回n以内的可以被7整除的所有数字。
# ❌ 正常人能想到的方法:
@timeshow
def f_loop(n):
L=[]
for i in range(n):
if i % 7 ==0:
L.append(i)
return L
# ✅ 列表推导式
@timeshow
def f_list(n):
L = [i for i in range(n) if i % 7 == 0]
return L
# ✅ 迭代器
@timeshow
def f_iter(n):
L = (i for i in range(n) if i % 7 == 0)
return L
# ✅ 过滤器
@timeshow
def f_filter(n):
L = filter(lambda x: x % 7 == 0, range(n))
return L
# ✅ 精确控制循环次数
@timeshow
def f_mind(n):
L = (i*7 for i in range(n//7))
return L
5、避免循环重复计算
如果你有一个迭代器,必须用它的元素做一些耗时计算,比如匹配正则表达式。你应该将正则表达式模式定义在循环之外,因为最好只编译一次模式,而不是在循环的每次迭代中一次又一次地编译它。
只要有可能,就应该尝试在循环外进行尽可能多的运算,比如将函数计算分配给局部变量,然后在函数中使用它。
# ❌ 应改避免的方式:
@timeshow
def f_more(s):
import re
for i in s:
m = re.search(r'a*[a-z]?c', i)
# ✅ 更好的方式:
@timeshow
def f_less(s):
import re
regex = re.compile(r'a*[a-z]?c')
for i in s:
m = regex.search(i)
s = ["abctestabc"] * 1_000
f_more(s)
f_less(s)
6、少用内存和全局变量
内存占用是指程序运行时使用的内存量,为了让python代码运行得更快,应该减少程序的内存使用量,尽量减少变量或者对象的数量。
python访问局部变量比全局变量更有效,在有必要情况下,应该始终尝试忽略声明全局变量,一个在程序中定义过的全局变量会一直存在,直到整个程序编译完成,所以它一直占据着内存空间。另一方面,局部变量访问更快,且函数完成后即可回收,因此,使用多个局部变量比使用全局变量会更好。