dict后裔的快速复制

时间:2015-03-09 15:10:36

标签: python performance dictionary copy

如(Fast way to copy dictionary in Python)所述,dict.copy()copy.copy()快得多。我有一个类是dict的后代,带有一些额外的元数据:

class DictWithTimestamp(dict):
    def __init__(self, timestamp):
        self.timestamp = timestamp

如果我只做DictWithTimestamp(1234).copy(),那么我会得到一个没有时间戳的字典。有没有办法保持dict.copy()的速度并保留我的元数据?

1 个答案:

答案 0 :(得分:0)

起初我考虑过__copy__覆盖,但这样你就不会使用内置的dict复制方法了。所以,跳转到更新

您可以为__copy__类定义DictWithTimestamp方法,您可以在其中复制其他类数据。来自docs

  

为了让一个类定义自己的副本实现,它可以   定义特殊方法__copy__()__deepcopy__()。前者是   调用实现浅拷贝操作;没有额外的   参数传递。调用后者来实现深层复制   操作;它传递了一个参数,即备忘录字典。如果   __deepcopy__()实现需要制作组件的深层副本,它应该使用组件调用deepcopy()函数   作为第一个参数,备忘录字典作为第二个参数。

更新:您可以使用collections.MutableMapping子类(请在此处详细了解:How to "perfectly" override a dict?):

class DictWithTimestamp(collections.MutableMapping):
    def __init__(self, timestamp=None):
        self.store = dict()
        self.timestamp = timestamp

    def __getitem__(self, key):
        return self.store[key]

    def __setitem__(self, key, value):
        self.store[key] = value

    def __delitem__(self, key):
        del self.store[key]

    def __iter__(self):
        return iter(self.store)

    def __len__(self):
        return len(self.store)

    def setstore(self, store):
        self.store = store

    def copy(self):
        copy = self.__class__(self.timestamp)
        copy.setstore(self.store.copy())
        return copy

测试:

>>> d = DictWithTimestamp(1234)
>>> d['i'] = 1
>>> d.timestamp
1234
>>> d1 = d.copy()
>>> d1.items()
[('i', 1)]
>>> d1.timestamp
1234