需要对返回大数据的函数进行延迟评估

时间:2014-02-27 21:09:55

标签: python lazy-evaluation

现在真的错过了Haskell。

我有这段代码:

for i in someFunc(arg0...argN):
    //some logic

问题是someFunc的返回值很大,我的内存不足。

我以为我可以将它包装在一个生成器中,但这没有帮助,因为我不控制someFunc,又称:

def gen_someFunc(someFunc):
    for i in someFunc(arg0...argN):
        yield i

没有帮助,因为someFunc仍然会立即评估。我如何懒惰地评估someFunc

1 个答案:

答案 0 :(得分:2)

在Python(或Haskell,这不是)中,你不能懒惰地排队一个返回完全物化对象的函数。使用该函数后可能会发生延迟,但如果数据一下子全部转储给您,那么您无能为力。

也许有一些参数可以调用你还不知道的函数来让你懒得评价它,但我们不知道这里给出的信息。

如果你可以对内存中的数据进行初始调用,那么作为生成器调用它的Pythonic方法将是

gen_some_func = iter(someFunc(arg0...argN))

不要写这个函数,然后再调用它。

def gen_someFunc(someFunc):
    for i in someFunc(arg0...argN):
        yield i