Python列表拼接效率

itertools.chain 只是生成一个生成器,所以如果您可以使用生成器而不是列表,那么生成时间是恒定的,但在访问每个元素时需要付出代价。否则,list_a[0:0] = list_b 比 list_a = list_b + list_a 快大约6倍。

我认为list_a = list_b + list_a 是最易读的选择,而且已经相当快了。

您提到的两种使用append()的for循环方法速度非常慢,因此我没有包含它们。

在 1.6 GHz 双核 Intel Core i5 上,使用 16 GB 的 2133 MHz LPDDR3 RAM 运行 Python 3.7.5 [Clang 11.0.0 (clang-1100.0.33.8)],使用以下代码运行:

from timeit import timeit

import random

import matplotlib.pyplot as plt

num_data_points = 1000

step = 10

methods = [

# ordered from slowest to fastest to make the key easier to read

# """for item in list_a: list_b.append(item); list_a = list_b""",

# """for item in list_b: list_a.insert(0, item)""",

# "list_a = list(itertools.chain(list_b, list_a))",

"list_a = list_b + list_a",

"list_a[0:0] = list_b",

"list_a = itertools.chain(list_b, list_a)",

]

x = list(range(0, num_data_points * step, step))

y = [[] for _ in methods]

for i in x:

list_a = list(range(i))

list_b = list(range(i))

random.shuffle(list_a)

random.shuffle(list_b)

setup = f"list_a = {list_a}; list_b = {list_b}"

for method_index, method in enumerate(methods):

y[method_index].append(timeit(method, setup=setup, number=30))

print(i, "out of", num_data_points * step)

ax = plt.axes()

for method_index, method in enumerate(methods):

ax.plot(x, y[method_index], label=method)

ax.set(xlabel="number of elements in both lists", ylabel="time (s) (lower is better)")

ax.legend()

plt.show()