Python 从一个迭代器创建两个字典

Python 从一个迭代器创建两个字典,python,performance,dictionary,iterator,Python,Performance,Dictionary,Iterator,我需要创建两个字典,同时从一个生成器读取输入。我担心的是,dict和数据原则上只需要滚动一次。我应该如何进行 # dummy data def data(): yield 'a', 5 yield 'b', 8 yield 'c', 12 # two iterations, bad. first = {k: v + 1 for k, v in data()} second = {k: 2 * v for k, v in data()} # One iteration

我需要创建两个字典,同时从一个生成器读取输入。我担心的是,dict和数据原则上只需要滚动一次。我应该如何进行

# dummy data
def data():
    yield 'a', 5
    yield 'b', 8
    yield 'c', 12

# two iterations, bad.
first  = {k: v + 1 for k, v in data()}
second = {k: 2 * v for k, v in data()}

# One iteration only, but it scans both dicts on each step?
first  = {}
second = {}
for k, v in data():
    first[k]  = v # this needs an underlying iteration over `first`, right?
    second[k] = v # and this needs another underlying iteration over `second`..

# Is there aa.. multiple comprehension?
first, second = {k: v + 1, k: 2 * v for k, v in data()} # SyntaxError
# Would it be just equivalent to the previous loop?

第二种方法可能是最好的方法,向
dict
添加一个键不需要在
dict
上进行底层迭代。事实上,时间复杂度仅为O(1),即恒定时间,且与字典大小无关。

您所说的“这需要在
第一次
上进行底层迭代”是什么意思?Dicts不需要迭代来分配一个新的项目,它是一个O(1)操作。第二个版本更好,但是如果可能的话,一个单一的理解没有好处。只需使用两个dict理解,复杂度为2O(n),仍然是O(n)。如果你从速度和复杂性的角度来思考,两者之间没有明显的区别。@AshwiniChaudhary,我不知道。怎么可能呢?:)@Joydepbhattacharjee哦,实际上,2O(n)仍然是时间的两倍:p那不是O(1)吗?太棒了!怎么可能呢?好消息,谢谢:)@Chris_Rands是O(1)不是常数时间,线性时间是O(n)?õ.Ô@iago lito还注意到,
dict
理解比
for
循环有一些优化,在某些情况下,执行两个理解实际上更快。很难预先知道这一点,如果性能至关重要,您需要在数据上测试这一点