更改字典时避免 Python 中的 deepcopy()

Avoid deepcopy() in Python when changing dictionary

我正在寻找一种解决方案,以避免在我的任务中使用 Python。

我正在使用 chu-liu-edmonds 算法实现统计依赖解析器。我有一个表示为字典的图,每个头节点都存储为一个键,每个头节点都有一个列表,其中包含 class 弧的一个或多个对象作为值。

在cle-algorithm中,我需要修改graph(契约一个循环)。这意味着,我需要删除圆弧对象和头部,并添加其他对象,而我稍后需要原始图形来扩展那些收缩的循环。现在,我通过深度复制原始图并将其传递给合约函数来实现这一点。

现在我 运行 使用 cProfile 编写程序,发现与 deepcopy 相关的所有内容都是算法中花费最多时间的部分。

所以我的问题是:在我的情况下有什么方法可以avoid/reduce吗?

更新: 如果你想改变 dict 中的列表,你无法避免 deepcopy() 但你应该执行以下操作:

"Save"只有图的alterable/deletable个元素(即列表)的值,不是全图。然后对dict/graph进行必要的修改,然后就可以使用"saved"元素对图进行进一步的修改。

使用 dict.copy(),如下所示 d.copy() 快 100000 倍:

from copy import deepcopy
from time import time

# with simply assignment -------------

d = {"a":[x for x in range(1000000)]}

t = time()
e = d
print 'elapsed time with standard assignment:', time()-t

e["b"] = [1,2,3]
del e["a"]
print d.keys()

# with deepcopy() --------------------

d = {"a":[x for x in range(1000000)]}

t = time()
e = deepcopy(d)
print '\nelapsed time with deepcopy():', time()-t

e["b"] = [1,2,3]
del e["a"]
print d.keys()

# with d.copy() ---------------------

d = {"a":[x for x in range(1000000)]}

t = time()
e = d.copy()
print '\nelapsed time with d.copy():', time()-t

e["b"] = [1,2,3]
del e["a"]
print d.keys()

输出:

elapsed time with standard assignment: 0.000110149383545
['b']

elapsed time with deepcopy(): 1.78457307816
['a']

elapsed time with d.copy(): 2.09808349609e-05
['a']

正如@dmargol1 在评论中所建议的那样,我能够通过从头开始构建图形而不是复制和修改它来避免 deepcopy() 和 copy(),这实际上要快得多。

如果可以的话:做吧!

如果需要复制,有两种方法。如果您不需要更改值,则可以使用 copy(),因为它比 deepcopy() 快得多(请参阅@george-solymosi 的评论)。如果需要更改值,deepcopy 是唯一的方法(请参阅@gall 的评论)。