Python列表(list)常用方法性能对比与insert陷阱解析
本文基于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]
以上即为本文的全部内容,希望能为读者的学习与工作带来帮助,欢迎继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









