MST
星途 面试题库

面试题:Python 中不同方式向列表添加元素的性能对比

在Python中,有 append()、extend()、+ 运算符等方式向列表添加元素,请分别阐述这些方式的原理,并说明在何种场景下哪种方式性能更优,举例说明。
41.7万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

append() 原理

append() 方法用于在列表的末尾添加一个新的元素。它直接修改原始列表对象,将传入的对象作为一个整体添加到列表的末尾。其时间复杂度为 O(1),因为在列表末尾添加元素不需要移动其他元素,只涉及到在内存中追加一个对象引用。

extend() 原理

extend() 方法用于将一个可迭代对象(如列表、元组、集合等)的所有元素添加到另一个列表的末尾。它会迭代传入的可迭代对象,并逐个将元素添加到原始列表中。时间复杂度为 O(k),其中 k 是可迭代对象的长度,因为需要遍历可迭代对象的每个元素并添加到列表。

+ 运算符原理

使用 + 运算符连接两个列表时,会创建一个新的列表对象,该新列表包含了两个操作数列表的所有元素。它不会修改原始的列表对象。时间复杂度为 O(m + n),其中 m 和 n 分别是两个操作数列表的长度,因为需要创建一个新列表并复制两个列表的所有元素。

性能场景分析

  1. 单个元素添加:当需要添加单个元素时,append() 性能最优。因为 extend() 需要将单个元素先转换为可迭代对象,+ 运算符会创建新列表。例如:
my_list = []
# 使用 append() 添加单个元素
import timeit
print(timeit.timeit(lambda: my_list.append(1), number = 10000)) 
  1. 添加多个元素:如果要添加多个元素,extend() 性能通常优于 + 运算符和多次调用 append()。因为 + 运算符创建新列表开销大,多次 append() 每次都有 O(1) 操作,整体开销也较大。例如:
my_list = []
new_elements = [1, 2, 3, 4, 5]
# 使用 extend() 添加多个元素
import timeit
print(timeit.timeit(lambda: my_list.extend(new_elements), number = 10000)) 
  1. 连接两个列表:如果只是想连接两个列表,且不关心是否修改原始列表,+ 运算符语法简洁,但性能不如 extend()。例如:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
# 使用 + 运算符连接列表
import timeit
print(timeit.timeit(lambda: list1 + list2, number = 10000)) 

在需要修改原始列表且添加多个元素时,extend() 性能更好;添加单个元素用 append();只是想连接列表且不介意创建新列表,+ 运算符简洁,但性能稍逊。