带生成器表达式的Python for循环是否值得现有字典使用?

带生成器表达式的Python for循环是否值得现有字典使用?,python,list,for-loop,generator-expression,Python,List,For Loop,Generator Expression,我有一个模拟器程序,可以对现有字典中的所有对象进行大量循环。字典包含数十万个对象,每个对象都有函数和属性 我想知道,在为每个循环创建生成器表达式时,如何权衡速度/内存,以及这是否比简单地循环字典中的值更好。对于许多循环,循环中还将有一个if语句 简单for循环和if语句示例: for obj in dict.values(): if obj.attr or n.state=='value': obj.someFunction() for obj in (n for n

我有一个模拟器程序,可以对现有字典中的所有对象进行大量循环。字典包含数十万个对象,每个对象都有函数和属性

我想知道,在为每个循环创建生成器表达式时,如何权衡速度/内存,以及这是否比简单地循环字典中的值更好。对于许多循环,循环中还将有一个if语句

简单for循环和if语句示例:

for obj in dict.values():
    if obj.attr or n.state=='value':
        obj.someFunction()
for obj in (n for n in dict.values() if n.attr or n.state=='value'):
        obj.someFunction()
生成器表达式示例:

for obj in dict.values():
    if obj.attr or n.state=='value':
        obj.someFunction()
for obj in (n for n in dict.values() if n.attr or n.state=='value'):
        obj.someFunction()
所以我真正想知道的是:在这里创建生成器有什么意义吗?或者这只会花费更多的时间并增加复杂性,因为字典已经存在于内存中了?
我已经对使用的时间做了一些测试,对于这个程序来说,差异似乎可以忽略不计,所以我最感兴趣的是可能的内存使用情况。

使用这样的生成器没有任何好处。这两个变量都需要在
dict.values()
上迭代,如果n.attr或n.state=='value',则都需要通过
进行过滤–生成器只为生成器对象本身和额外的内部迭代增加开销。
虽然这种开销很小,但实际上没有任何优势


使用
if
语句选择显式
for
语句。它的性能和可读性都更好。

您是否尝试过使用
性能计数器进行测试
?我没有,但是我用
timeit
做了一些简单的测试,时间差也不多说。将更新问题以反映这一点!我希望这会稍微慢一点,并且没有空间效益,(怎么可能?)。第一种方法是最具可读性/惯用性的。不管怎样,生成器表达式只是在dict上循环,那么它怎么可能更快呢?使用循环+生成器与仅使用循环总是有开销的,如果仅仅通过使用额外的生成器对象来创建/存储/迭代的话。是什么让你认为为这个添加一个生成器可能会有好处呢?@helge通过
for
循环进行迭代已经很懒惰了。您可以将生成器视为一级迭代—如果您已经进行了迭代,那么它将毫无意义。生成器对于传递迭代非常有用,这里不需要。