Python3.5+中制作列表浅拷贝的最快方法是什么?

12
在 Python 3.5+ 中,有几种方法可以制作一个列表的浅拷贝。显而易见的方法包括:
  • some_list.copy()
  • some_list[:]
  • list(some_list)
  • [*some_list]
  • 还有其他一些方法...
哪种方法最快? 注意: 虽然这个问题涉及到 "列表的副本",但它仅关注 Python 3.5+ 中的性能。如果你需要回答类似 "为什么需要在 Python 中复制一个列表?"或 "浅拷贝和深拷贝的区别是什么?" 的问题,请阅读以下链接: 如何克隆或复制一个列表?
1个回答

29
唯一合理的答案是比较它们的执行时间。由于这个问题涉及到Python 3.5+,我要提醒一下,在Python 3.5中,PEP 448 - 添加解包通用化被批准,并且证明在Python 3.5+中使用[*some_list]是制作列表浅层副本最快的方法,下面给出了测量结果。当然还有许多其他制作副本的方法,但我将重点关注以下几种:

  • some_list.copy()
  • some_list[:]
  • list(some_list)
  • [*some_list]
  • from copy import copy; copy(some_list)

请记住,这些时间是相对于彼此的,但趋势应该是类似的。如下图所示,当 len(some_list) >= 1000 时,所有变体的行为都大致相同: enter image description here

但当 len(some_list) < 1000 时,我们有一个明显的赢家,那就是[*some_list]enter image description here

这些测量是在Python 3.6.3,Windows 7中进行的。


2
这些线收敛,因此正确答案似乎实际上是“都一样”。除了非常小的列表,此时答案是“谁在乎”;) - zvone
7
那些有许多非常小的列表的人可能会关心(也许)。另一个选项是 some_list * 1,我觉得它很值得注意,因为它在我的测试中是第二快的(仅次于[*some_list]),而且很简短。 - superb rain
除非该副本是某个其他重复执行的循环的内部循环,否则请返回已翻译的文本。 - Anthony Tomasic
1
@zvone 我很在意。这正是我需要知道的。 - z0rberg's

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接