Python的itertools产品内存消耗

时间:2012-05-23 12:48:35

标签: python generator itertools

documentation表示笛卡尔积函数

the actual implementation does not build up intermediate results in memory.

如何使用发电机实现这一目标?有人能告诉我一个例子 2个生成器的内存消耗是否有限?

2 个答案:

答案 0 :(得分:9)

查看模块的源代码,itertools.product()实际上将每个参数转换为元组:

// product_new() in itertoolsmodule.c
for (i=0; i < nargs ; ++i) {
    PyObject *item = PyTuple_GET_ITEM(args, i);
    PyObject *pool = PySequence_Tuple(item); //<==== Call tuple(arg)
    if (pool == NULL)
        goto error;
    PyTuple_SET_ITEM(pools, i, pool);
    indices[i] = 0;
}

换句话说,itertools.product()的内存消耗在输入参数的大小上似乎是线性的。

答案 1 :(得分:4)

嗯,它也说:

  

嵌套循环像具有最右边元素的里程表一样循环   在每次迭代中前进。这种模式创造了一个词典   排序,以便输入的iterables排序,产品   元组按排序顺序发出。

这几乎就是它在实现中的作用(Modules/itertoolsmodule.c

这是状态对象:

typedef struct {
    PyObject_HEAD
    PyObject *pools;       /* tuple of pool tuples */
    Py_ssize_t *indices;   /* one index per pool */
    PyObject *result;      /* most recently returned result tuple */
    int stopped;           /* set to 1 when the product iterator is exhausted */
} productobject;

函数product_next返回下一个项目,它使用此状态和引用中描述的算法生成下一个状态。请参阅this answer以了解内存要求。

对于普通教育,您可以阅读有关如何使用C扩展名here创建状态的生成器。