from itertools import permutations,teeclass MagicSquare: def __init__(self,size,combinations): self.size = size self.range = range(self.size) self.combinations = combinations def getGrID(self,entrIEs): return [ entrIEs[self.size*i:self.size*(i+1)] for i in self.range ] def checkGrID(self,grID): check_sum = sum(grID[0]) if any( sum(row) != check_sum for row in grID ): return False if any( sum(row[col] for row in grID) != check_sum for col in self.range ): return False if sum(grID[diag][diag] for diag in self.range) != check_sum: return False if sum(grID[diag][self.size-diag-1] for diag in self.range) != check_sum: return False return True def solutions(self): combinations,self.combinations = tee(self.combinations) for entrIEs in combinations: grID = self.getGrID(entrIEs) if self.checkGrID(grID): yIEld grIDif __name__ == '__main__': combs = permutations(range(20,30),9) ms = MagicSquare(3,combs) for solution in ms.solutions(): for row in solution: print row print
想到这个问题有两个明显的解决方案.首先,我可以要求提供生成器而不是请求生成器本身的函数,但这需要用户包装它们的生成器表达式.其次,我可以缓存解决方案.为了论证,假设我不再需要检查对角线是否有足够数量的解决方案,所以我需要更新checkGrID并重复组合.
所以,我的问题是:在没有创建这个潜在的巨大内存问题的情况下,真的没有办法复制生成器吗?我不关心保留生成器的部分状态,我只是想让它迭代与原始生成器相同的值.
编辑
看起来在Python 3.X中,您可以使用copy.deepcopy来复制依赖项都可以选择的itertools对象.
解决方法 没有什么是不可能的…以下情况适用于itertools.permutations.不要以为它适用于任何迭代,因为它不会!
>>> from itertools import permutations>>> combs = permutations(range(20,9)>>> from copy import deepcopy>>> combs2 = deepcopy(combs)>>> next(combs)(20,21,22,23,24,25,26,27,28)>>> next(combs2)(20,28)总结
以上是内存溢出为你收集整理的python – 复制生成器而不会炸毁内存全部内容,希望文章能够帮你解决python – 复制生成器而不会炸毁内存所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)