python:在obj.func()中为`i执行`每次迭代重新运行`func`?

时间:2010-09-12 22:57:43

标签: python optimization loops for-loop

假设我有以下代码:

for a in object.a_really_huge_function():
    print a

为了防止a_really_huge_function多次运行,我习惯用其他语言执行此操作:

a_list = object.a_really_huge_function()
for a in a_list:
    print a

Python中有必要吗? in之后的部分会在每个循环上运行吗?

3 个答案:

答案 0 :(得分:7)

python解释器是你的朋友。

>>> def some_func():
...     print 'in some_func'
...     return [1, 2, 3, 10]
... 
>>> for a in some_func():
...     print a
... 
in some_func
1
2
3
10

简而言之,不,它被召唤一次。

答案 1 :(得分:4)

您还可以使用生成器来避免在算法的每个步骤之后放弃控制,从而避免返回大量结果:

def a_really_huge_fuction(huge_number):
    i = 0
    while i < huge_number:
        yield i   # Relinquishes control to caller, resume execution at next line
        i = i + 1

在这种情况下,函数被调用一次,但其执行时间分布在huge_number个不同的时间。有关详细信息,请参阅yield文档。

答案 2 :(得分:1)

没有必要。

for a in object.a_really_huge_function():

只调用a_really_huge_function一次。

将结果保存在变量中的唯一好处是,如果您在代码中的其他位置调用相同的函数。

如果函数返回一个列表,那么通过object.a_really_huge_function()返回iterator,你可能会在内存使用方面做得更好,但你没关系。