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

god*_*ygo 1 python performance copy shallow-copy python-3.x

这是在Python 3.5+中制作浅层副本的几种替代方法list.显而易见的是:

  • some_list.copy()
  • some_list[:]
  • list(some_list)
  • [*some_list]
  • 和别的...

哪种方法最快?

注意:虽然此问题与"列表副本"有关,但它仅涉及Python 3.5+中的性能.如果您需要回答" 为什么需要Python中的列表副本? "或" Python中列表的浅层和深层复制有什么区别? "的问题,请阅读以下内容: 如何克隆或复制清单?

god*_*ygo 7

这个问题唯一合理的答案是比较他们的执行时间.由于这个问题涉及Python 3.5+,我会记得在Python 3.5中PEP 448 - 附加解包概括被批准,结果证明这[*some_list]是在Python 3.5+中制作列表的浅表副本的最快方法,测量结果是如下所示.当然还有很多方法可以制作副本,但我将重点关注以下方面:

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

请记住,这些时间是彼此相关的,但趋势应该是相似的.从下图可以看出,当以下情况时,所有变体的行为大致相同len(some_list) >= 1000: 在此输入图像描述

但是,len(some_list) < 1000我们有一个明显的赢家,它是[*some_list]:在此输入图像描述

使用Python 3.6.3,Windows 7进行测量.

  • @zvone 拥有“非常多”非常小的列表的人,这才是关心的人:-)(也许​​)。另一个选项是“some_list * 1”,我发现它值得注意,因为它在我自己的测试中是第二快的(仅被“[*some_list]”击败)并且很短。 (5认同)
  • 这些线收敛,所以似乎正确答案实际上是*“都一样”*。除了非常小的列表,在这种情况下,答案是 *"who cares"* ;) (2认同)