2013-05-25 4 views
3

Имеем вопрос о сборе мусора в Python 2.7. Почему этот кодсборщик мусора python и список

class A: 
    def __init__(self, name): 
     self.name = name 
    def __del__(self): 
      print self.name, 

aa = [A(str(i)) for i in range(10)] 

del aa 

Отдайте OUTPUT 9 8 7 6 5 4 3 2 1 0 и не 0 1 2 3 4 5 6 7 8 9 или любой другой перестановку.

+3

Почему это проблема? Где вы ожидаете определенного заказа? –

+1

Это просто любопытство) – alexvassel

+1

также PyPy делает это как '0 1 2 3 4 5 6 7 8 9', но Jython делает это так же, как CPython – jamylak

ответ

5

Поскольку объект списка Python уменьшает количество ссылок из элементов, которые он ссылается в обратном порядке:

static void 
list_dealloc(PyListObject *op) 
{ 
    Py_ssize_t i; 
    PyObject_GC_UnTrack(op); 
    Py_TRASHCAN_SAFE_BEGIN(op) 
    if (op->ob_item != NULL) { 
     /* Do it backwards, for Christian Tismer. 
      There's a simple test case where somehow this reduces 
      thrashing when a *very* large list is created and 
      immediately deleted. */ 
     i = Py_SIZE(op); 
     while (--i >= 0) { 
      Py_XDECREF(op->ob_item[i]); 
     } 
     PyMem_FREE(op->ob_item); 
    } 
    if (numfree < PyList_MAXFREELIST && PyList_CheckExact(op)) 
     free_list[numfree++] = op; 
    else 
     Py_TYPE(op)->tp_free((PyObject *)op); 
    Py_TRASHCAN_SAFE_END(op) 
} 

Смотрите, что комментарий; удаление ссылок, начиная с конца, по-видимому, уменьшает измельчение в некоторых случаях с большими списками.

Мое предположение заключается в том, что при создании очень большого списка последние элементы все еще находятся в кеше, и разыменование этих первых помогает уменьшить отток кеша. Добавить замену и начало с конца делает еще большую разницу.

+0

Получил его. Благодарю. Кто такой Кристиан Тисмер?)) – alexvassel

+0

Создатель [Stackless Python] (http://en.wikipedia.org/wiki/Stackless_Python). –

3

Python преимущественно полагается на подсчет ссылок для управления жизненными циклами объектов. (Я думаю, что он использует какую-то метку и прокрутку для обработки ссылочных циклов, но не цитируйте меня на этом.)

Я бы предположил, что при уничтожении перечисляет их элементы в обратном порядке , следовательно, поведение, которое вы видите.

Я не думаю, что порядок уничтожения элементов списка формально определен, и в этом случае это не «проблема» как таковая.

Смежные вопросы