重用字典而不重建

时间:2014-10-18 18:22:47

标签: python algorithm python-2.7 dictionary data-structures

P / S:采用的方法 best way to extract subset of key-value pairs from python dictionary object 正在重新创建一个新的子键字典。它很慢(我试过了)。使用下面shx2给出的Subdicview的答案在效率方面很有用。

我有一个python字典,例如

d={"a1":Obj1, "a2":Obj2,"a3":Obj3,...,"a10":Obj10}

Obj1Objn是自创的python类的一些对象。

问题在于,在一个1亿次的循环中,我需要在每次迭代时使用不同的键子集,比如我需要"a1""a3",我现在所做的就是重构字典

d1={"a1":Obj1, "a2":Obj2,"a3":Obj3}

每当我想使用它时。最后,我做了1亿个词典的重建。

是否有更有效的方法来处理这种情况(例如,将我感兴趣的d中的键静音)而不是每次在循环中重构字典?

4 个答案:

答案 0 :(得分:1)

您可以使用以下"轻量级" sub-dict-view类。这可能是最快的方法,因为它避免了在每次迭代时创建新的dicts(创建视图对象很快)。

from UserDict import DictMixin

class SubDictView(DictMixin):

    def __init__(self, dct, keys):
        self._dct = dct
        self._keys = keys

    def __getitem__(self, key):
        if key not in self._keys:
            raise KeyError(key)
        return self._dct[key]

    def keys(self):
        return set(self._dct) & self._keys

    def __setitem__(self, key, val):
        raise RuntimeError('SubDictView is read-only')

    def __delitem__(self, key):
        raise RuntimeError('SubDictView is read-only')

d = {'a': 1, 'b': 2, 'c': 3}
dv = SubDictView(d, {'b', 'c'})
print dv
# {'c': 3, 'b': 2}
print 'a' in dv
# False
print dv['b']
# 2
print dv.get('a', 999)
# 999

如果您已将密钥子集存储为set,则可以避免转换到set中的__init__来获得更快的速度。

答案 1 :(得分:0)

一个(面向速度的)解决方案是使用pandas.Series

import pandas as pd
series = pd.Series(d.values(), index = d.keys())
subseries1 = series[:3]
subseries2 = series[10:20]
...

如果您需要一个非连续索引的键子集,您仍然可以使用以下内容:

subseries3 = series.ix[[1,3,8]]

虽然在这种情况下它可能会慢一些,因为这种索引(与切片相反)会导致创建一个新系列(而不是原始系列的视图,这要快得多)。

pandas.Series的界面在某些方面类似于dict,因此您无需更改(或根本)更改代码的其余部分。

答案 2 :(得分:0)

您的问题远非明确,但如果我理解正确,您可以使用operator.itemgetter。如果你的字典是这样的:

d = {'a1': 1, 'a2': 2, 'a3': 3, 'a4': 4, 'a5': 5}

然后:

>>> operator.itemgetter('a1', 'a3', 'a5')(d)
(1, 3, 5)

答案 3 :(得分:0)

至关重要的是要注意set(dict) 在Python 2.7中创建一个视图(如接受的答案所暗示的那样)。它创建了一个集合,这样做实际上非常慢。 Python 2.7中的字典视图可以通过字典上的view*方法访问(在这种情况下,我们需要dict.viewkeys()