在python中合并两个列表的最快方法是啥?

Posted

技术标签:

【中文标题】在python中合并两个列表的最快方法是啥?【英文标题】:What is the fastest way to merge two lists in python?在python中合并两个列表的最快方法是什么? 【发布时间】:2013-06-07 07:49:59 【问题描述】:

给定,

list_1 = [1,2,3,4]
list_2 = [5,6,7,8]

在python中实现以下最快的方法是什么?

list = [1,2,3,4,5,6,7,8]

请注意,在 python 中可以有多种方法来合并两个列表。 我正在寻找最省时的方法。

我尝试了以下,这是我的理解。

代码

import time

c = list(range(1,10000000))
c_n = list(range(10000000, 20000000))

start = time.time()
c = c+c_n
print len(c)
print time.time() - start

c = list(range(1,10000000))
start = time.time()
for i in c_n:
    c.append(i)
print len(c)
print time.time() - start

c = list(range(1,10000000))
start = time.time()
c.extend(c_n)
print len(c)
print time.time() - start

输出

19999999
0.125061035156
19999999
1.02858018875
19999999
0.03928399086

所以,如果有人不想在问题中重复使用 list_1/list_2,那么 extend 就是要走的路。另一方面,"+" 是最快的方式。

不过我不确定其他选项。

【问题讨论】:

看这篇文章 -> ***.com/questions/1720421/merge-two-lists-in-python 您并没有真正在此处合并,而是在连接...这真的是您想要的吗? list1 = [1,2,3,5]; list2 = [4,5,6,7] 应该得到什么? 没有比list_1 + list_2更快的速度了 extend 是合并列表最快的方法。 【参考方案1】:

你可以只使用连接:

list = list_1 + list_2

如果你不需要保留 list_1,你可以修改它:

list_1.extend(list_2)

【讨论】:

如果 list_1 为空(或 list_2 为空或两者兼有)会怎样? @hepcat72 没什么特别的,它会产生正确的结果。 正确的结果是什么?如果 list_1 为空且 list_2 包含单个字符串“a”,那么 list 将包含 [undef,"a"] 还是仅包含 ["a"]? undef?哪有这回事。 [] + ["a"] == ["a"]。如果您添加一个包含零项的列表和一个包含一项的列表,那么您最终会得到一个包含一项的列表,当然,不是两项。 我是python新手。感谢您的解释。只是想弄清楚python是如何工作的。【参考方案2】:

list_1 + list_2 做到了。示例 -

>>> list_1 = [1,2,3,4]
>>> list_2 = [5,6,7,8]
>>> list_1 + list_2
[1, 2, 3, 4, 5, 6, 7, 8]

【讨论】:

【参考方案3】:

如果您使用的是 python 3,还有另一种方法可以做到这一点,而且速度会更快一些(仅在 python 3.7 上测试过)

[*list1, *list2]

基准测试

from timeit import timeit
x = list(range(10000))
y = list(x)

def one():
    x + y

def two():
    [*x, *y]

print(timeit(one, number=1000, globals='x':x, 'y': y))
print(timeit(two, number=1000, globals='x':x, 'y': y))
0.10456193100253586
0.09631731400440913

【讨论】:

有趣的是,对于大小为 10k 元素的列表,我得到了与您相似的数字,但是当我进入包含 100k 元素的列表时,one 更快(至少使用 3.6) 嗯,我刚刚尝试了 100k 个元素,结果是第二个仍然更快。 我在 3.6 上,所以这可能是相关的 是的,第一个:40.26142632599658 第二个:29.216321185995184 这是 100 万个项目的结果,第二个明显更快, 笔记本电脑在尝试运行 100 万件物品时摔倒了,相信你的话 :)【参考方案4】:

我测试了几种合并两个列表的方法(见下文),并在每次运行几次以标准化缓存更改后得出以下顺序(这会产生大约 15% 的差异)。

import time
c = list(range(1,10000000))
c_n = list(range(10000000, 20000000))
start = time.time()
*insert method here* 
print (time.time()-start)

方法一:c.extend(c_n)

代表结果:0.11861872673034668

方法二:c += c_n

代表性结果:0.10558319091796875

方法三:c = c + c_n

代表结果:0.25804924964904785

方法四:c = [*c, *c_n]

代表结果:0.22019600868225098

结论 如果要就地合并,请使用 +=.extend()。它们明显更快。

【讨论】:

我用 python 3.8 对其进行了测试,并确认了 Kiran 的结果。请注意,方法 2 使用 INPLACE_ADD 字节码指令,这意味着它在原地运行(在同一内存上),因此它比使用 BINARY_ADD 的方法 3 更快【参考方案5】:
a=[1,2,3]
b=[4,5,6]

c=a+b
print(c)

输出:

 >>> [1, 2, 3, 4, 5, 6]

在上面的代码中,“+”运算符用于将两个列表连接成一个列表。

另一种解决方案:

 a=[1,2,3]
 b=[4,5,6]
 c=[] #Empty list in which we are going to append the values of list (a) and (b)

 for i in a:
     c.append(i)
 for j in b:
     c.append(j)

 print(c)

输出:

>>> [1, 2, 3, 4, 5, 6]

【讨论】:

以上是关于在python中合并两个列表的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Powershell 中,将两个表合并为一个的最佳方法是啥?

python如何合并两个列表?

在 Python 中提取和清理 HTML 正文文本的最快、最无错误的方法是啥?

如何在python中把两个列表的各项分别合并为列表

计算R中前两个主成分的最快方法是啥?

比较两个字节数组的最快方法是啥?