性能优化的重要性
性能优化能让代码运行更快、占用资源更少。一个优化良好的程序性能会有明显提升。
# 低效代码
defsum_numbers(n):
total = 0
for i in range(n):
total += i
return total
# 高效代码
defsum_numbers_fast(n):
return n * (n - 1) // 2
使用内置函数
内置函数经过高度优化,比手动实现快很多。
# 慢
result = []
for item in my_list:
if item > 0:
result.append(item)
# 快 - 使用列表推导式
result = [item for item in my_list if item > 0]
# 更快 - 使用filter
result = list(filter(lambda x: x > 0, my_list))
选择合适的数据结构
不同数据结构的性能差异较大。
# 列表查找慢 O(n)
my_list = [1, 2, 3, 4, 5]
if3in my_list: # 遍历整个列表
pass
# 集合查找快 O(1)
my_set = {1, 2, 3, 4, 5}
if3in my_set: # 直接哈希查找
pass
# 字典操作快
my_dict = {'a': 1, 'b': 2}
value = my_dict.get('a') # O(1)
使用NumPy向量化
向量化操作比循环快很多。
import numpy as np
# 慢 - Python循环
result = []
for i in range(len(arr)):
result.append(arr[i] * 2 + 1)
# 快 - NumPy向量化
result = arr * 2 + 1
使用生成器节省内存
生成器按需生成数据,不占用大量内存。
# 占用大量内存
defget_numbers(n):
return [i for i in range(n)]
# 节省内存
defget_numbers_gen(n):
for i in range(n):
yield i
使用装饰器缓存结果
避免重复计算。
from functools import lru_cache
@lru_cache(maxsize=128)
deffibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
使用C扩展加速
对于CPU密集型任务,可以使用C扩展。
# 使用Cython编译
# fib.pyx
deffibonacci(int n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
# 使用Numba即时编译
from numba import jit
@jit(nopython=True)
deffibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
实战案例:优化循环
优化前和优化后的对比。
import time
# 优化前
defslow_function():
result = []
for i in range(1000000):
if i % 2 == 0:
result.append(i * 2)
return result
# 优化后
deffast_function():
return [i * 2for i in range(1000000) if i % 2 == 0]
# 测试性能
start = time.time()
slow_function()
print(f"慢版本耗时: {time.time() - start:.4f}秒")
start = time.time()
fast_function()
print(f"快版本耗时: {time.time() - start:.4f}秒")
使用内置模块
标准库模块经过优化,性能更好。
# 使用collections模块
from collections import defaultdict, Counter
# defaultdict避免键不存在错误
d = defaultdict(list)
d['key'].append('value')
# Counter快速统计
words = ['a', 'b', 'a', 'c', 'b']
count = Counter(words)
性能测试技巧
使用timeit模块进行性能测试。
import timeit
setup = '''
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
'''
time = timeit.timeit('fibonacci(20)', setup=setup, number=100)
print(f"执行时间: {time:.4f}秒")