本文目录导读:

要判断一个Python案例的效率高不高,不能只看代码本身,还需要结合它的用途、数据规模和运行环境。
我可以先直接给你一个通用判断标准,然后再通过几个常见的代码案例来具体分析。
快速判断标准:5个“低效信号”
如果一个案例出现了以下情况,通常效率不高(O(n²) 或更差):
- 循环嵌套循环(特别是嵌套遍历列表/数组):
for i in list:里面套for j in list:。 - 在循环内修改列表/字典的大小:比如在
for遍历列表的时候,list.append()或list.pop()(可能引起内存重新分配或索引失效)。 - 使用
for i in range(len(list))索引取值:Python的for item in list直接迭代通常更快,且更优雅。 - 频繁拼接字符串:
s = s + 'new'在循环中会导致大量的内存复制,应该用''.join(list)。 - 不恰当地使用Python原生函数:比如自己写循环找最大值,而不用内置的
max()(底层是C语言实现)。
实战案例分析
假设你看到的案例是以下几种典型场景:
案例1:查找列表里的重复元素
低效版本(大概O(n²)):
def find_duplicates_slow(lst):
duplicates = []
for i in range(len(lst)):
if lst[i] in lst[i+1:]: # in 操作在切片里又是 O(n)
duplicates.append(lst[i])
return duplicates
高效版本(O(n)):
def find_duplicates_fast(lst):
seen = set()
duplicates = set()
for item in lst:
if item in seen:
duplicates.add(item)
else:
seen.add(item)
return list(duplicates)
判断结果:低效版本效率极低,数据量一大就会慢到无法接受。
案例2:数据去重
低效版本:
unique_list = []
for item in long_list:
if item not in unique_list: # not in 列表是 O(n)
unique_list.append(item)
高效版本:
unique_list = list(set(long_list)) # set去重是 O(n)
判断结果:低效版本慢1~2个数量级。
案例3:读取文件并统计单词
低效版本:
counts = {}
# 一次性读取所有内容到内存,如果文件非常大(如10GB)会直接卡死或OOM
with open('big_file.txt', 'r') as f:
for line in f:
words = line.split()
for word in words:
if word in counts:
counts[word] += 1
else:
counts[word] = 1
高效版本:
from collections import defaultdict
counts = defaultdict(int)
with open('big_file.txt', 'r') as f:
for line in f: # 逐行读取,不一次性加载
for word in line.split():
counts[word] += 1
判断结果:这个例子本身不算特别低效,但如果一次性读取(f.read())且文件巨大,就是灾难,逐行处理就是高效的。
这个案例效率高吗?
如果你给我看具体代码,我可以直接分析它的时间复杂度和内存使用,根据我的经验:
- 高:常见于使用内建函数(
map,filter,itertools),用set/dict做查找,用@lru_cache做记忆化,使用生成器(yield)处理流式数据。 - 低:常见于手写排序,手写列表查找,多重嵌套
for循环,以及完全不顾Python语言特性(如用列表当队列,用字符串拼接做日志)。
你能直接把那个案例的代码贴出来给我吗? 我可以给你一个明确的“高/中/低”评价,并解释为什么,以及如何优化。