如何优化我编写的Fibonacci斐波那契数列生成器Python代码?
三种实现的优劣对比
你的初始实现版本
- 优势:逻辑非常直观,所有生成过的数列项都存在
prev_nums列表中,如果你后续需要随机访问任意历史项,直接按索引取值即可,使用场景适配随机读需求。 - 劣势:内存占用会随生成数列的长度线性增长,因为存储了全部历史值;
count变量属于冗余设计,完全可以用循环变量i替代,没必要单独维护计数;代码没有封装成函数,复用性差,要调整生成数量必须直接修改循环内的range(20)硬编码值。
第一种网上实现(普通函数直接打印版)
def fibonacci(): a=0 b=1 for i in range(6): print(b) a,b= b,a+b
- 优势:没有用列表存储全量历史值,仅维护两个变量存前两项,内存占用固定为O(1),不管生成多少项内存都不会上涨;用了Python元组解包语法直接赋值
a,b = b,a+b,不需要写中间变量ans,代码更简洁;封装成了函数,复用性比你的初始版本好。 - 劣势:还是硬编码了生成数量
range(6),调整生成数量需要修改函数内部代码;直接把打印逻辑写在函数内,耦合度太高,如果你需要拿到生成值做其他处理(比如求和、写入文件)就无法直接使用,必须修改函数逻辑。
第二种网上实现(生成器版本)
def fib(n): a, b = 0, 1 for _ in range(n): yield a a, b = b, a + b
- 优势:同样是O(1)内存占用,运行效率很高;参数化了生成数量
n,调用时传入对应数值就能生成指定长度的数列,复用性极强;用yield返回值,不会强制打印结果,你拿到生成器后可以按需处理:遍历打印、转列表、逐个取值做计算都可以,灵活性非常高;循环用_作为占位符,明确表示该循环变量不需要使用,代码可读性更高。 - 劣势:唯一的局限是如果需要频繁随机访问历史数列项,生成器只能按顺序向后取值,无法直接跳转到指定索引的项,这种场景下不如你存列表的版本方便。
可参考的优化要点
- 移除冗余的
count变量:你当前逻辑里count初始为1、每次循环加1,它的值完全等于i+2,直接用循环变量计算索引即可,不需要单独维护计数。 - 优先用元组解包简化赋值:不需要单独写
ans变量存储中间结果,直接用a, b = b, a+b就能完成前两项的更新,代码更简洁。 - 封装为参数化函数:不要硬编码循环次数,把要生成的项数作为参数传入,复用性会大幅提升。
- 根据使用场景选实现方案:如果需要频繁访问历史项,就保留存列表的逻辑;如果只是需要逐个生成使用,就用生成器版本,内存效率更高。
- 拆分计算逻辑和输出逻辑:计算代码只负责返回结果,要不要打印、怎么处理结果交给调用方决定,代码的适用范围会更广。
内容的提问来源于stack exchange,提问作者some_user_3
相关产品推荐
相关产品推荐

