更改字典

时间:2015-07-29 06:57:34

标签: python parsing runtime

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

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

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

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

所以我的问题是:在我的情况下,有没有办法避免/减少这种情况?

2 个答案:

答案 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的注释)。