Python列表(list)常用方法性能对比与insert陷阱解析

码头散步
码头散步
发布时间:2026-10-13| 5人浏览过
原创

本文基于Python 3.6.8环境,使用timeit模块对list的生成、append、insert、pop及extend等方法进行MacOS与CentOS7下的性能对比测试。结果显示list强转与生成式效率较高,insert头部插入最慢;pop尾部删除优于头部。同时深入解析了使用insert生成连续列表时的元素位置异常现象,为优化代码性能提供参考。

Python列表性能测试概述

本文详细解析了Python内置数据类型list中各常用方法的性能表现,通过具体示例代码展示测试结果,为开发者在编写高效Python代码时提供具有实际价值的参考依据。

测试环境与模块介绍

测试环境

所有测试代码均在MacOS操作系统与CentOS7系统环境下运行,所使用的Python解释器版本固定为3.6.8。

测试模块

本次性能测试采用的核心工具是Python标准库中的timeit模块。

该模块专门用于精确测量一小段Python代码片段的执行耗时。

Timer类

class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>)

Timer类是timeit模块中用于测量代码段执行速度的核心类。

stmt参数指定需要测试执行的代码语句(statement)。

setup参数用于配置执行测试代码前所需的初始化设置。

timer参数关联一个与具体平台相关的定时器函数。

Timer类的timeit方法

timeit.Timer.timeit(number=1000000)

这是Timer类中用于执行测试并返回结果的方法。其中number参数定义测试循环的次数,默认值为1000000次;方法返回值为执行代码的平均耗时,数据类型为float(秒)。

列表创建方法效率对比

列表内置方法的性能测试

在Python中,生成列表通常可通过列表生成式或append、insert、extend等方法实现。以下将对比这些不同创建方式的执行效率。


from timeit import Timer


def test_list():
  lst = list(range(1000))

def test_generation():
  lst = [i for i in range(1000)]


def test_append():
  lst = []
  for i in range(1000):
    lst.append(i)

def test_add():
  lst = []
  for i in range(1000):
    lst += [i]

# 在列表的头部insert
def test_insert_zero():
  lst = []
  for i in range(1000):
    lst.insert(0,i)

# 在列表的尾部insert
def test_insert_end():
  lst = []
  for i in range(1000):
    lst.insert(-1,i)

def test_extend():
  lst = []
  lst.extend(list(range(1000)))


t1 = Timer("test_list()","from __main__ import test_list")
print(f"test_list takes {t1.timeit(number=1000)} seconds")

t2 = Timer("test_generation()","from __main__ import test_generation")
print(f"test_generation takes {t2.timeit(number=1000)} seconds")

t3 = Timer("test_append()","from __main__ import test_append")
print(f"test_append takes {t3.timeit(number=1000)} seconds")

t4 = Timer("test_add()","from __main__ import test_add")
print(f"test_add takes {t4.timeit(number=1000)} seconds")

t5 = Timer("test_insert_zero()","from __main__ import test_insert_zero")
print(f"test_insert_zero takes {t5.timeit(number=1000)} seconds")

t6 = Timer("test_insert_end()","from __main__ import test_insert_end")
print(f"test_insert_end takes {t6.timeit(number=1000)} seconds")

t7 = Timer("test_extend()","from __main__ import test_extend")
print(f"test_extend takes {t7.timeit(number=1000)} seconds")

首先在MacOS系统环境下,执行上述测试代码所得结果如下:


"""
test_list takes 0.012904746999993222 seconds
test_generation takes 0.03530399600003875 seconds
test_append takes 0.0865129750000051 seconds
test_add takes 0.08066114099983679 seconds
test_insert_zero takes 0.30594958500023495 seconds
test_insert_end takes 0.1522782449992519 seconds
test_extend takes 0.017534753999825625 seconds
"""

从测试结果可见:直接使用list()方法强制转换的效率最高;其次是列表生成式;append方法与直接加法(+=)的效率紧随其后且两者表现相当;insert方法的执行效率最低,且从头部插入(索引0)的效率明显低于从尾部插入;最后,将强转后的列表通过extend方法合并到新列表的过程,其耗时并未显著减少。

接着查看在Linux系统(CentOS7)下的执行结果:

pop方法删除性能分析

列表pop方法的性能测试

pop方法支持从指定位置(如第0位)删除元素,也支持从末尾删除元素(默认行为)。下面对比这两种不同位置删除操作的性能差异。


from timeit import Timer

def test_pop_zero():
  lst = list(range(2000))
  for i in range(2000):
    lst.pop(0)


def test_pop_end():
  lst = list(range(2000))
  for i in range(2000):
    lst.pop()
t1 = Timer("test_pop_zero()","from __main__ import test_pop_zero")
print(f"test_pop_zero takes {t1.timeit(number=1000)} seconds")

t2 = Timer("test_pop_end()","from __main__ import test_pop_end")
print(f"test_pop_end takes {t2.timeit(number=1000)} seconds")

在MacOS环境下,程序的执行结果如下:


test_pop_zero takes 0.5015365449999081 seconds

test_pop_end takes 0.22170215499954793 seconds

随后测试Linux系统中的执行结果:

结果显示:从列表尾部删除元素的效率远高于从头部(索引0)删除的效率。

insert方法使用陷阱解析

关于列表insert方法的一个小坑

若尝试使用insert方法生成一个包含0到5的列表[0,1,2,3,4,5](需注意此方法效率较低,建议选用其他生成方式),可能会遇到如下现象:


def test_insert():
  lst = []
  for i in range(6):
    lst.insert(-1,i)
    print(lst)

test_insert()

最终结果出乎意料——第一个插入的元素始终停留在列表末尾!


[0]
[1, 0]
[1, 2, 0]
[1, 2, 3, 0]
[1, 2, 3, 4, 0]
[1, 2, 3, 4, 5, 0]

以上即为本文的全部内容,希望能为读者的学习与工作带来帮助,欢迎继续支持本站。

相关标签:

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

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 算法库。