在不使用 .deepcopy() 的情况下深度复制嵌套列表的更快方法是什么?

问题描述 投票:0回答:1

我有两个具有以下结构的变量:

# initialization
    O1 = [[] for g in range(n)] 
    for i in range(n):
        O1[i] = [[] for g in range(m)] 
         
    O2 = [[] for g in range(n)] 
    for i in range(n):
        O2[i] = [[] for g in range(m)] 

然后,我将这两个输入到一个初始函数中,其中将不同的值附加到它们上:

for i in range(n):
    for j in range(m):
        O1[i][j].append([s, as, pat, 0])
        O2[i][j].append([[ol, oa, os, ot],[dl, da, ds],tpat, tp, 0])

如您所见,列表的内部结构变得复杂,尤其是在 O2 的情况下。给 O1 和 O2 赋值后,它们被输入到其他几个函数中。每个函数都需要对 O1 和 O2 进行深度复制,并修改该副本以供自己使用,而不更改原始 O1 和 O2 变量。这些更改包括 .remove() 和 .append() 以及内部列表中值的 +/-。重要的是,无论怎么改变,原来的O1和O2都不应该有任何改变。该过程迭代运行,首先为 O1 和 O2 分配新值,然后输入到其他几个函数中并进行复制和编辑,而不对用作输入的原始 O1 和 O2 进行任何更改。 使用 .deepcopy() 是我知道的唯一方法,但由于这是一个迭代过程,.deepcopy() 函数会显着减慢代码速度,尤其是当 O1 和 O2 很大时。我尝试过使用元组作为不可变的数据结构,但考虑到初始和内部结构以及函数中所做的更改,它不起作用。使用元组可以防止append() 和remove() 更改,但不能防止+/- 操作。 如果有人能建议一种更快的方法来做到这一点,我将不胜感激。

python nested-lists deep-copy
1个回答
0
投票

可以有多种解决方案:

  1. 使用 numpy 数组而不是普通的 python 列表,内存布局允许更快的操作。
  2. 使用写时复制技术。您可以使用像 Pyrcient (https://github.com/tobgu/pyrcient) 这样的库,它会延迟复制直到实际进行修改,因此基本上会复制被修改的部分。
© www.soinside.com 2019 - 2024. All rights reserved.