Python作为一门简洁易用的编程语言,在开发效率上有明显优势,但默认解释执行的特性也让它的运行性能常常被诟病。在实际开发中,通过合理的优化手段,完全可以让Python代码的性能得到显著提升,满足大部分场景的需求。

基础代码编写优化
很多性能问题其实源于不好的编码习惯,调整这些细节就能获得不错的提升效果。
避免不必要的循环嵌套
多层循环会成倍增加时间复杂度,能减少嵌套就尽量减少。比如要统计两个列表中相同元素的数量,不要写双重循环:
# 不推荐的写法
list1 = [1, 2, 3, 4, 5]
list2 = [3, 4, 5, 6, 7]
count = 0
for i in list1:
for j in list2:
if i == j:
count += 1
print(count)
# 推荐的写法
set2 = set(list2)
count = 0
for i in list1:
if i in set2:
count += 1
print(count)
优先使用内置函数和库
Python的内置函数和标准库都是用C语言实现的,执行效率远高于自己写的Python代码。比如求和不要用循环累加,直接用sum()函数:
# 不推荐
nums = [1, 2, 3, 4, 5]
total = 0
for num in nums:
total += num
# 推荐
total = sum(nums)
算法层面的优化
算法的时间复杂度是决定性能的核心因素,选择更优的算法往往能带来数量级的性能提升。
降低时间复杂度
比如查找元素时,列表的查找时间复杂度是O(n),而字典和集合的查找是O(1),频繁查找的场景优先使用字典或集合。下面的例子对比两种查找方式的效率:
import time
# 列表查找测试
test_list = list(range(100000))
start = time.time()
for _ in range(1000):
99999 in test_list
print("列表查找耗时:", time.time() - start)
# 集合查找测试
test_set = set(range(100000))
start = time.time()
for _ in range(1000):
99999 in test_set
print("集合查找耗时:", time.time() - start)
减少重复计算
循环中如果某个值不会变化,就不要在循环内部重复计算,提前计算好再使用:
import math
# 不推荐
for i in range(10000):
result = math.sqrt(100) * i # sqrt(100)每次循环都计算
# 推荐
sqrt_100 = math.sqrt(100)
for i in range(10000):
result = sqrt_100 * i
使用性能优化工具
Python提供了不少工具帮助定位性能瓶颈,针对性优化效果更好。
使用cProfile分析性能
cProfile是Python内置的性能分析工具,可以统计每个函数的执行时间和调用次数,快速找到耗时最多的部分:
import cProfile
def slow_func():
total = 0
for i in range(100000):
total += i
return total
def main():
slow_func()
# 其他函数调用
cProfile.run("main()")
使用PyPy解释器
PyPy是Python的另一种解释器,采用JIT(即时编译)技术,对于循环密集型的代码,性能可以比默认的CPython解释器提升数倍。如果你的代码没有依赖CPython特有的扩展,可以尝试用PyPy运行。
常见优化误区
优化时要注意不要过度优化,有些时候为了微小的性能提升牺牲代码可读性是不值得的。另外,过早优化也是常见问题,应该先保证代码功能正确,再通过性能分析找到瓶颈再优化,不要一开始就纠结每一行代码的性能。
还有一点要注意,Python的性能优化是有上限的,如果场景对性能要求极高,比如高频交易、实时渲染等,可能需要考虑用C、C++等语言重写核心模块,再通过Python调用,兼顾开发效率和运行性能。