Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Python迭代器拆分为块的语法不正确_Python_Itertools - Fatal编程技术网

将Python迭代器拆分为块的语法不正确

将Python迭代器拆分为块的语法不正确,python,itertools,Python,Itertools,我有一些代码,它获取元组列表的笛卡尔积,然后将生成的迭代器映射并强制转换回列表,以供后续函数使用: # Take the Cartesian product of a list of lists of tuples groups = itertools.product(*list_of_lists_of_tuples) # Mapping and casting to list is necessary to put in the correct format for a subsequent

我有一些代码,它获取元组列表的笛卡尔积,然后将生成的迭代器映射并强制转换回列表,以供后续函数使用:

# Take the Cartesian product of a list of lists of tuples
groups = itertools.product(*list_of_lists_of_tuples)

# Mapping and casting to list is necessary to put in the correct format for a subsequent function
groups_list = list(map(list, groups))
这一切在抽象上都很好,但在处理大量列表时会导致内存错误。它看起来像是
itertools.product
已经是一个生成器;内存瓶颈似乎是映射和重铸。我在想,我也许可以通过把自己分成几块来解决这个问题。现在,关于如何将Python迭代器拆分成块的一般问题已经在本网站上被问了很多次,似乎有很多好的答案,包括但不限于:

…但我认为,在我开始理解可裂变材料和发电机时,肯定存在一些令人尴尬的缺陷,因为我似乎无法让它们中的任何一个正常工作。例如,假设一个grouper函数与其他线程中看到的类似:

def grouper(self, it, n):
    iterable = iter(it)
    while True:
        chunks = itertools.islice(iterable, n)
        try:
            first_chunk = next(chunks)
        except StopIteration:
            return
        yield itertools.chain((first_chunk,), chunks)
…我希望得到的结果是我的
itertools.product
对象的块,然后我可以独立地对其进行操作:

groups = itertools.product(*list_of_lists_of_tuples)

# create chunks of the iterator that can be operated on separately and then combined back into a list
groups_list = []
for x in self.grouper(groups, 100):
    some_groups_list = list(map(list, x))
    groups_list.extend(some_groups_list)

我得到的是空名单。显然有些地方出了问题,我认为这里的主要问题是我对这方面缺乏了解。如果您有任何建议,我们将不胜感激。

内存问题将使结果成为一个庞大的列表。您没有指定为什么需要列表,或者分块如何避免这种情况。为什么不根据需要逐个处理每个元组呢?
itertools.product
对象是绝对必要的。我需要以某种方式从该对象转到上面描述的最终
groups\u列表
对象。如何从A到B并不重要,我想找到一个内存高效的解决方案。我不能处理单个元组;我感兴趣的是许多元组列表的笛卡尔积。您的
组\u列表
不会比以前更节省内存。这将降低内存效率,因为现在您也有了一个中间列表。你需要专注于实际处理块,而不是将它们添加到一个大列表中。问题是我确实需要那个大列表。以后在工作流中会多次访问它。我不能简单地用每一块做点什么,然后把它扔到一边。代码中内存密集的部分是映射和重铸。我想如果我能把那个部分分成更小的块,它的内存消耗就会更少。如果有更聪明的方法,我当然愿意接受想法,但我需要像
groups\u list
这样的结束状态,因为该列表的版本对于许多下游流程都至关重要。如果我在这里遗漏了什么,请提前道歉。内存问题是您正在创建的列表对象的数量,所有这些都占用了堆上的空间。任何地方都没有中间对象。因此,是的,从A到B没有比这更节省内存的方法了。你需要找到一种方法来处理你的结果,而不需要在内存中存在完整的产品。内存问题将把结果变成一个庞大的列表。您没有指定为什么需要列表,或者分块如何避免这种情况。为什么不根据需要逐个处理每个元组呢?
itertools.product
对象是绝对必要的。我需要以某种方式从该对象转到上面描述的最终
groups\u列表
对象。如何从A到B并不重要,我想找到一个内存高效的解决方案。我不能处理单个元组;我感兴趣的是许多元组列表的笛卡尔积。您的
组\u列表
不会比以前更节省内存。这将降低内存效率,因为现在您也有了一个中间列表。你需要专注于实际处理块,而不是将它们添加到一个大列表中。问题是我确实需要那个大列表。以后在工作流中会多次访问它。我不能简单地用每一块做点什么,然后把它扔到一边。代码中内存密集的部分是映射和重铸。我想如果我能把那个部分分成更小的块,它的内存消耗就会更少。如果有更聪明的方法,我当然愿意接受想法,但我需要像
groups\u list
这样的结束状态,因为该列表的版本对于许多下游流程都至关重要。如果我在这里遗漏了什么,请提前道歉。内存问题是您正在创建的列表对象的数量,所有这些都占用了堆上的空间。任何地方都没有中间对象。因此,是的,从A到B没有比这更节省内存的方法了。您需要找到一种方法来处理您的结果,而不需要完整的产品存在于内存中。