Python 如何模拟使用更少RAM的列表理解?

Python 如何模拟使用更少RAM的列表理解?,python,python-3.x,list,Python,Python 3.x,List,有一个函数可以创建一个列表,其中包含12个列表中的所有元素组合 def make_list(self): results = ['{} {} {} {} {} {} {} {} {} {} {} {}'.format(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12) for x1 in self.list1 for x2 in self.list2

有一个函数可以创建一个列表,其中包含12个列表中的所有元素组合

def make_list(self):
    results = ['{} {} {} {} {} {} {} {} {} {} {} {}'.format(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12)
               for x1 in self.list1
                    for x2 in self.list2
                        for x3 in self.list3
                            for x4 in self.list4
                                for x5 in self.list5
                                    for x6 in self.list6
                                        for x7 in self.list7
                                            for x8 in self.list8
                                                for x9 in self.list9
                                                    for x10 in self.list10
                                                        for x11 in self.list11
                                                            for x12 in self.list12]
但它使用了太多的RAM,正如预期的那样。 有没有可以使用更少内存的解决方案? 我试图使用
map()
,但我不太明白它可能是什么函数


或者最好的解决办法是在C++上或Go席上重写这个问题。< P> > P>问题是,你试图记住所有可能的组合(因为你构建一个字符串并返回一个整体)。在你的情况下,你必须产生(12个列表和大约40个项目)大约40个组合。即使列表中的每个元素只需要一个字节,并且是文本形式,也需要几倍的时间

但是你可以在没有疯狂记忆需求的情况下产生所有这些组合。您可以使用滑动索引打印所有可能性

出于教育目的,我将给出一个示例解决方案,说明如何生成所有这些组合,而无需消耗数以百万计的RAM内存(用于变量列表编号):

来自随机导入randint
#用单词而不是数字来读代码更容易
#对于索引列表中的位置,这些名称更有意义
INDEX=0#实际列表中用于组合的索引
长度=1#实际列表的计算长度
列表=2#参考实际列表
平均尺寸=4
偏差=1
类演示(对象):
list1=范围内(0,平均大小+randint(-偏差,+偏差))的列表(randint(-100100)
list2=范围内(0,平均大小+randint(-偏差,+偏差))的列表(randint(-100100))
list3=范围内(0,平均大小+randint(-偏差,+偏差))的列表(randint(-100100)
list4=范围内(0,平均大小+randint(-偏差,+偏差))的列表(randint(-100100)
def组合(自):
“”“所有可能组合的生成器。一次生成一个以逗号分隔的字符串形式的组合”“”
指数=[
#实际列表索引开始、实际列表的长度、对该列表的引用
[0,len(self.list1)-1,self.list1],
[0,len(self.list2)-1,self.list2],
[0,len(self.list3)-1,self.list3],
[0,len(self.list4)-1,self.list4],
]
总位置=长度(指数)
#计算所有可能组合的数量
轮数=无
对于索引中的项目:
如果为无:
轮数=项目[长度]+1
其他:
轮数*=(项目[长度]+1)
当前_轮=0#组合指数
当前轮<轮时:
组合=列表()
进位位置=0
对于范围内的当前位置(0,总位置):
#在当前位置取三倍的索引、长度和列表(更易于阅读)
当前项目=索引[当前位置]
#选择当前组合
组合.追加(当前_项[列表][当前_项[索引])
#如果当前位置处于进位状态
如果当前位置问题不在于如何生成列表,而在于首先需要一个庞大的列表。相反,使用生成器惰性地生成元组。(您永远没有时间实际迭代整个序列,但理论上是可能的。)

最简单的方法是使用
itertools.product

import itertools

tuples = itertools.product(self.list1, self.list2, ..., self.list12)

# This will run virtually forever, but never use more memory than is needed for
# a single tuple
for t in tuples:
   print('{} {} {} {} {} {} {} {} {} {} {} {}'.format(*t))

您如何处理此结果列表?@DanD。只要把它写在PyQt5应用程序的字段中就行了。不过,我有点怀疑这是否是你真正想要的。这将为所有这12个列表中的每个元素组合创建格式化字符串。您有12个嵌套循环,因此您正在创建大约
n**12
,其中
n
是其中一个列表的平均元素数。。。增长很快。如果
n
为2,则列表将为4096;如果为3,则列表已在50万元素范围内;如果为4,则列表将达到约1700万元素。我认为生成1700万个元素以在PyQt中显示不是一个好主意。您通常定义一个模型,该模型只延迟加载显示的值。“平均来说,假设每个列表中有40个项目”。那么,您想显示所有这些~16777216000000000000000元素吗?