创建列表的多个副本的最快方法

时间:2017-08-31 08:02:12

标签: python numpy

问题

我正在为我的迷宫求解器开发一个广度优先的搜索算法,到目前为止它正在运行。我通过复制前一个堆栈并将当前值附加到它来跟踪当前堆栈。

由于复制列表需要花费大量时间,因此我想在一次操作中创建列表的多个副本。

到目前为止我尝试了什么

  • 复制列表并将其分配给多个变量。

    l = [1, 2, 3]
    a = b = c = l[:]  # Just creates references and no individual lists
    
  • 使用copy函数的numpy数组(快于list[:])。

问题

创建一个列表的多个副本的最快方法是什么?

2 个答案:

答案 0 :(得分:5)

不要为您的堆栈使用普通的Python列表。使用Lisp样式的链表,因此您的堆栈彼此共享大部分结构,并且使用附加元素构建新堆栈是恒定时间:

def empty_stack():
    return ()
def push(stack, item):
    return (item, stack)
def stack_to_list(stack):
    l = []
    while stack:
        item, stack = stack
        l.append(item)
    return l[::-1]

这里,push以恒定时间运行并产生一个新堆栈,而不会改变旧堆栈,因此您可以反复调用旧堆栈上的push而不复制它。

答案 1 :(得分:0)

您可以批量复制它:

def copyList(thelist, number_of_copies):
    return tuple(thelist[:] for _ in xrange(number_of_copies))

a, b, c = copyList(range(10), 3)

这里有live example