我有一个python字典,例如
d={"a1":Obj1, "a2":Obj2,"a3":Obj3,...,"a10":Obj10}
Obj1
到Objn
是自创的python类的一些对象。
问题在于,在一个1亿次的循环中,我需要在每次迭代时使用不同的键子集,比如我需要"a1"
到"a3"
,我现在所做的就是重构字典
d1={"a1":Obj1, "a2":Obj2,"a3":Obj3}
每当我想使用它时。最后,我做了1亿个词典的重建。
是否有更有效的方法来处理这种情况(例如,将我感兴趣的d
中的键静音)而不是每次在循环中重构字典?
答案 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()
)