2012-05-23 25 views
13

Các documentation nói rằng chức năng sản phẩm DescartesPython của

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

Làm thế nào có thể có được có thể với máy phát điện? Ai đó có thể chỉ cho tôi một ví dụ với mức tiêu thụ bộ nhớ bị giới hạn cho 2 máy phát không?

+3

Bản sao có thể có của [Tại sao tôi nhận được MemoryError với itertools.product?] (Http://stackoverflow.com/q/8695422/222914) –

Trả lời

9

Nhìn vào mã nguồn của module, itertools.product() thực sự chuyển đổi tất cả các đối số cho một tuple:

// 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; 
} 

Nói cách khác, tiêu thụ bộ nhớ itertools.product() 's dường như là tuyến tính trong kích thước của các đối số đầu vào.

4

Vâng, nó cũng nói:

Các vòng lồng nhau chu kỳ giống như một odometer với các yếu tố ngoài cùng bên phải tiến trên mỗi lần lặp. Mẫu này tạo thứ tự từ vựng để nếu các vòng lặp của đầu vào được sắp xếp, sản phẩm bộ dữ liệu được phát ra theo thứ tự sắp xếp.

này là khá nhiều cách thức hoạt động trong việc thực hiện (Modules/itertoolsmodule.c)

Đây là đối tượng trạng thái:

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; 

Và mục tiếp theo được trả về bởi hàm product_next, trong đó sử dụng này trạng thái và thuật toán được mô tả trong báo giá để tạo ra trạng thái tiếp theo. Xem this answer để hiểu các yêu cầu về bộ nhớ.

Đối với giáo dục phổ thông, bạn có thể đọc về cách tạo máy phát điện có trạng thái từ tiện ích mở rộng C here.