我正在寻找一种解决方案,以避免在使用Python的任务中使用deepcopy()。
我正在使用chu-liu-edmonds算法实现统计依赖性解析器。我有一个表示为字典的图形,每个头节点都存储为一个键,每个节点都有一个列表,其中包含一个或多个类弧的对象作为值。
在cle算法中,我需要修改图形(合约一个循环)。这意味着,我需要删除弧形对象和头部,并添加其他内容,而后来我需要原始图形来扩展这些缩小的周期。现在,我通过深度复制原始图并将其传递给契约函数来实现这一点。
现在我使用cProfile运行我的程序,发现与deepcopy有关的所有内容都是算法中花费最多时间的部分。
所以我的问题是:在我的情况下,有没有办法避免/减少这种情况?
答案 0 :(得分:1)
<强>更新强> 如果您想在dict中更改列表,则无法避免 deepcopy(),但您应该执行以下操作:
“仅保存”图表的可更改/可删除元素(即列表)的值,不 完整图表。然后在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']
答案 1 :(得分:0)
正如@ dmargol1在评论中建议的那样,我能够避免使用deepcopy()和copy(),而不是从头开始构建图形,而不是复制和修改它,这实际上要快得多。
如果可能的话:做吧!
如果需要复制,有两种方法。如果你不需要改变值,copy()就是要走的路,因为它比deepcopy()快得多(参见@ george-solymosi的评论)。如果需要更改值,则深度复制是唯一的方法(参见@gall的注释)。