别让慢代码拖累你的程序
写Python的时候,很多人只关注功能能不能实现,却忽略了性能问题。等数据一上来,程序卡得像老牛拉车,这时候才后悔当初没多考虑效率。其实,只要在写代码时注意几个关键点,就能让程序快上几倍甚至几十倍。
用对数据结构,事半功倍
比如你要频繁判断某个元素是否在集合里,用列表(list)就太慢了,每次都要遍历。换成集合(set),查找速度直接从O(n)降到接近O(1)。
# 慢:用列表判断成员
if item in my_list:
print("找到啦")
# 快:用集合
if item in my_set:
print("找到啦")
能不用循环就别硬写for
很多人习惯写for循环处理数据,但其实Python内置的map、filter和列表推导式通常更快,尤其是处理大批量数据时。
# 普通写法
squares = []
for x in range(10000):
squares.append(x ** 2)
# 更快的写法
squares = [x ** 2 for x in range(10000)]
字符串拼接别用+号连加
当你需要把很多字符串拼在一起,比如生成日志或HTML片段,用+号会不断创建新对象,特别耗资源。推荐用join方法。
parts = ["hello", "world", "python", "fast"]
# 慢
result = ""
for part in parts:
result += part
# 快
result = "".join(parts)
避免在循环里做重复计算
有些人把函数调用或者属性访问放在循环条件里,结果每次都要重新算一遍。
# 慢:len每次都要计算
for i in range(len(my_list)):
process(my_list[i])
# 快:提前算好
n = len(my_list)
for i in range(n):
process(my_list[i])
善用内置函数和库
Python的内置函数像sum、max、min都是C实现的,比你自己写循环快得多。同样,处理大量数值时,NumPy比原生列表操作快一个数量级。
及时释放内存,别让变量堆积
处理大文件或大数据集时,记得及时删除不再使用的变量,尤其是中间临时结果。用del语句清掉它们,能有效减少内存压力。
temp_data = load_big_file()
processed = clean_data(temp_data)
del temp_data # 马上删掉,释放内存
用局部变量代替全局变量
函数内部访问局部变量比访问全局变量快,因为作用域查找更短。如果循环里频繁调用某个全局值,可以先赋给局部变量。
counter = 0
def increment():
global counter
temp = counter # 提升到局部
for _ in range(100000):
temp += 1
counter = temp
工具用起来:profile才是真相
别靠猜哪里慢,用cProfile看看真实耗时分布。
import cProfile
def main():
# 你的主逻辑
pass
cProfile.run('main()')