现在真的错过了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
?
答案 0 :(得分:2)
在Python(或Haskell,这不是)中,你不能懒惰地排队一个返回完全物化对象的函数。使用该函数后可能会发生延迟,但如果数据一下子全部转储给您,那么您无能为力。
也许有一些参数可以调用你还不知道的函数来让你懒得评价它,但我们不知道这里给出的信息。
如果你可以对内存中的数据进行初始调用,那么作为生成器调用它的Pythonic方法将是
gen_some_func = iter(someFunc(arg0...argN))
不要写这个函数,然后再调用它。
def gen_someFunc(someFunc):
for i in someFunc(arg0...argN):
yield i