Python循环遍历进阶:列表删除与性能优化实战

慢慢来
慢慢来
发布时间:2026-10-14| 4人浏览过
原创

本文深入探讨Python中的循环遍历技巧,重点解析在遍历列表时安全删除元素的多种方法。通过对比直接遍历、副本遍历、倒序遍历及filter高阶函数的实现,详细分析了各方案的时间与内存消耗。实验表明,利用底层C实现的filter函数可将运行速度提升13-15倍,是处理大规模数据循环时的优选方案,兼顾了开发效率与执行性能。

Python循环遍历详解

Python循环遍历详解

列表元素删除的挑战

对于循环遍历,大家通常熟悉的是for和while两种基本结构。本文将介绍一些更具实战价值的遍历技巧。在实际开发中,经常遇到需要在循环过程中删除列表元素的需求,那么如何正确地通过循环遍历来删除指定元素呢?

代码案例演示

直接通过代码案例来演示具体实现方式:

核心实现代码


import time

# 删除下面列表中所有张姓元素,输出的结果应该是['李老大','李老二']
lst = ['张老大', '张老二', '李老大', '张老三', '李老二']*10000

# 直接for循环遍历列表,remove需要删除的元素
def del1(lst):
  for i in lst:
    if i[0] == '张':
      lst.remove(i) # 在删lst[0]'张老大'的时候,列表长度变成4,导致lst[1]取值成了'李老大',跳过了'张老二'
  return lst # 返回的结果不符合预期


# 正向遍历,通过建一个原列表的副本,然后遍历副本,删除原列表中的元素
def del2(lst):
  lst2 = lst.copy() # 创建副本内存和时间开销大
  for i in lst2:
    if i[0] == '张':
      lst.remove(i) # 删除第一个匹配的元素,检索匹配时间开销大
  return lst # 结果虽然正确,但效率极低,不要用这种方法


# 使用高阶函数filter方法
def del3(lst):
  def comp(n): # 创建过滤函数
    return n[0] != '张' #对于首字符不是'张'的元素返回True,予以保留。若返回False的予以删除。
  return list(filter(comp, lst)) # filter高阶函数删除列表中的元素,
# 删除条件是comp方法,返回的是迭代器,需要list方法转成列表


# 倒序删除法
def del4(lst):
  for i in range(len(lst) - 1, -1, -1): # 注意len(lst)必须-1,因为列表元素下标是0至len(lst)-1;注意for循环左开右闭,
# 从lst队尾循环到开头必须是-1,写0会漏了lst[0];-1表示倒序排列。range实际就是int数字列表生成式,在这实际生成的是
# [49999,49998,..1,0],通过下标访问列表的指定元素。
    if lst[i][0] == '张':
      del lst[i]
  return lst


# 倒序删除之while循环,效果和for序号一致,运行效率差别极其微小(for序号方法内存开销略大一点点)。while循环需要写7行,
# for循环只要5行,更推荐使用for循环。但while循环代码阅读起来更易懂。
def del5(lst):
  length = len(lst) - 1
  while length >= 0:
    if lst[length][0] == '张':
      del lst[length]
    length -= 1
  return lst


# lst = del1(lst) # del1方法直接遍历列表删除指定元素,返回结果错误
# print(lst)

# t1 = time.time()
# lst = del2(lst) # del2方法通过创建原列表副本,遍历副本删除原件中的指定元素,返回结果正确,但是运行效率极低
# t2 = time.time()
# print(f"遍历方法删除元素用时:{t2 - t1:.5f}") # 4.51529,在这可以看到代码优化的必要性,运行结果虽然一致但性能差别极大。
# 评价性能一般看2个指标,1是时间消耗,2是资源消耗(通常指内存消耗,特殊场合还有别的资源消耗)。

t1 = time.time()
lst = del3(lst)
t2 = time.time()
print(f"filter方法删除元素用时:{t2 - t1:.5f}") # 0.00596

# t1 = time.time()
# lst = del4(lst)
# t2 = time.time()
# print(f"遍历方法删除元素用时:{t2 - t1:.5f}") # 0.07991

# t1 = time.time()
# lst = del5(lst)
# t2 = time.time()
# print(f"遍历方法删除元素用时:{t2 - t1:.5f}") # 0.08516

for与while循环性能对比

上述案例中的注释非常详尽,适合初学者阅读参考。从性能测试来看,del4()函数中的for循环与del5()函数中的while循环在时间消耗上几乎持平,但for循环的内存占用略高。由于for循环相比while循环能减少约两行代码,在Python追求“Pythonic”且性能指标相当的情况下,代码行数越少越佳,因此编写循环时优先推荐使用for语句。

filter函数的高效优势

此外需要指出,使用filter高阶函数的运行速度是for或while循环的13至15倍,这是因为filter底层实际执行的是C语言代码。Python中许多内置方法均基于C实现,熟练运用这些方法能显著提升运行效率。尽管Python常被公认具有“高开发效率、低运行效率”的特点,但只要对运算量巨大的循环代码块进行恰当优化(通常即采用此类C语言内置方法,有能力者也可自定义或引入第三方C扩展),Python的性能表现并不逊色,同时开发效率却大幅提升,这正是Python得以广泛流行的原因。

总结

以上就是关于Python循环遍历的详细内容,更多Python循环遍历相关资源请持续关注本站其他文章。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。