python – 复制生成器而不会炸毁内存

python – 复制生成器而不会炸毁内存,第1张

概述我正在写一个 python类,它找到所有可能的 magic squares给定一个整数大小和一个生成器用于可能的组合.这些组合是长度为** 2的元组,并被分成大小×大小的网格.代码本身工作正常,但重用生成器似乎需要itertools.tee.在下面显示的示例中,这会导致线程使用的内存跳转到300MB,因为迭代器中的每个值都存储在列表中. from itertools import permutat 我正在写一个 python类,它找到所有可能的 magic squares给定一个整数大小和一个生成器用于可能的组合.这些组合是长度为** 2的元组,并被分成大小×大小的网格.代码本身工作正常,但重用生成器似乎需要itertools.tee.在下面显示的示例中,这会导致线程使用的内存跳转到300MB,因为迭代器中的每个值都存储在列表中.

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 – 复制生成器而不会炸毁内存所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1196049.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存