写程序的时候,很多人只关心功能能不能实现,却忽略了代码跑得快不快。比如你写了个查找文件的小工具,处理几百个文件还行,结果一碰到上万文件就开始卡顿,这时候就得回头看看算法是不是“太笨”了。
别光看运行时间
最直接的办法是测运行时间,比如用 Python 的 time 模块:
import time
start = time.time()
# 运行你的算法
end = time.time()
print(f"耗时: {end - start} 秒")
但这个方法有坑。同一段代码,电脑刚开机跑一次,开了一堆浏览器再跑一次,时间可能差很多。外设、内存占用、后台进程都会干扰结果。所以单靠“秒表计时”不够准。
看复杂度才是正道
真正靠谱的是分析时间复杂度。比如你遍历一个列表找某个值,那就是 O(n);如果是嵌套两层循环处理数据,基本就是 O(n²),数据量一大,速度断崖式下跌。
举个例子,你在写个去重功能。用 list 逐个比对,每加一个元素都扫一遍已有的,这效率就是 O(n²)。换成 set 呢?插入和查找平均只要 O(1),速度提升可能是几十倍都不止。
小数据也得讲究
有人觉得“我数据就这么点,随便写写就行”。可现实是,今天一百条数据,明天产品经理说要导入历史记录,一下变成十万条。等用户投诉卡死了再改,不如一开始就把效率当回事。
比如排序,Python 内置的 sorted() 是 Timsort,平均 O(n log n),比你自己写的冒泡排序 O(n²) 强太多。别为了炫技手撸算法,善用语言自带的高效工具。
空间换时间很常见
有时候多花点内存,能换来速度飞跃。比如你要频繁判断某个用户名是否存在,每次都去查数据库或遍历列表太慢。不如启动时把所有名字加载到 set 里,内存多占点,但查询几乎瞬间完成。
当然也不能无脑堆内存。得看场景:服务器内存充足,优先保响应速度;嵌入式设备内存紧张,就得精打细算。
实际测试别偷懒
理论归理论,实测不能少。可以用 Python 的 cProfile 看哪一行拖了后腿:
import cProfile
cProfile.run('your_function()')
它会告诉你每个函数调用了几次,花了多少时间。有时候你以为慢的是算法,结果发现是读文件太慢,或者日志打印太多。问题定位准了,优化才有效。
算法效率不是高手专属,而是每个写代码的人都该养成的习惯。从写第一行循环开始,就想想“它会不会越跑越慢”,久而久之,代码自然更经得起考验。