【问题标题】:Cartesian Product memory error converting itertools.product to list将 itertools.product 转换为列表的笛卡尔积内存错误
【发布时间】:2013-08-22 20:34:39
【问题描述】:

我正在尝试创建列表列表的笛卡尔积。当我尝试将结果转换为列表时,它会给我一个内存错误。如果我在不将其转换为列表的情况下运行它,它运行良好。

lists = [['a','b','c' ],['a','b','c' ],['a','b','c' ],['a','b','c' ],['a','b','c' ],['a','b','c' ],['a','b','c' ],['a','b','c' ],['a','b','c' ]]
my_product = list(itertools.product(*lists))

我什至尝试使用 itertools.dropwhile 过滤一些结果以使其更小,然后再将其转换为列表,并且得到相同的结果。

filtered = itertools.dropwhile(lambda x: x[1]!=x[2] and x[3]!=x[4] and x[3]!=x[5] and x[4]!=x[5], my_product)

【问题讨论】:

    标签: python python-2.7 itertools


    【解决方案1】:

    您正在创建 19683 个由 9 个元素组成的新元组。您的计算机没有足够的内存同时用于所有这些元组。

    如果您使用list(),那么只会创建一个生成器对象,它会在您对其进行迭代时一个接一个地生成19683。

    您应该过滤itertools.product() 的输出而不将其转换为列表:

    my_product = itertools.product(*lists)
    filtered = itertools.dropwhile(lambda x: x[1]!=x[2] and x[3]!=x[4] and x[3]!=x[5] and x[4]!=x[5], my_product)
    

    您可以将filtered 变成一个列表,但如果您所做的只是遍历该列表并逐个处理项目,那么您不应该这样做。仅当您需要 随机 访问元素时才将其转换为列表。

    【讨论】:

      猜你喜欢
      • 2020-12-21
      • 2012-03-24
      • 2018-04-17
      • 1970-01-01
      • 2017-07-15
      • 2012-01-03
      • 2021-10-22
      • 2011-07-10
      • 2018-04-03
      相关资源
      最近更新 更多