Foros del Web » Programando para Internet » Python »

Python y el recolector de basura

Estas en el tema de Python y el recolector de basura en el foro de Python en Foros del Web. Hola a todos. ¿Tiene Python implantado un recolector de basura, al estilo de C#, por ejemplo? Gracias....
  #1 (permalink)  
Antiguo 08/06/2008, 16:34
Avatar de JuanBellas  
Fecha de Ingreso: junio-2008
Mensajes: 15
Antigüedad: 15 años, 10 meses
Puntos: 0
Python y el recolector de basura

Hola a todos.

¿Tiene Python implantado un recolector de basura, al estilo de C#, por ejemplo?

Gracias.
  #2 (permalink)  
Antiguo 11/06/2008, 06:59
Avatar de elquique  
Fecha de Ingreso: marzo-2004
Ubicación: Florida, Uruguay
Mensajes: 2.495
Antigüedad: 20 años, 1 mes
Puntos: 78
Respuesta: Python y el recolector de basura

Te dejo este link interesante donde mencionan eso mismo:

C++ y Python
http://blog.xhantt.com.ar/2008/02/c-y-python.html

Y algun otro link:
http://www.python.org/doc/2.3.5/ext/node24.html

http://www.arctrix.com/nas/python/gc/
__________________
Blog Jorge Oyhenard | Tutoriales Photoshop
  #3 (permalink)  
Antiguo 12/06/2008, 18:16
Avatar de JuanBellas  
Fecha de Ingreso: junio-2008
Mensajes: 15
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Python y el recolector de basura

Bueno, mi corta antiguedad no me permite incluir enlaces en el Foro, pero algo encontré que me ayudó a entender un poco más las cosas:

Cita:
Contar las referencias.

Python hace uso de una tecnica llamada contado de referencias para llevar una cuenta de cuantos objetos hay en la memoria. Esto quiere decir que Python lleva una cuenta interna de todos los objetos que estan en uso y de las partes mas interesantes de cada uno de estos objetos.
Para realizar esto, Python dispone de una variable interna llamada contador de referencias, que cuenta cuantas referencias existen para cada objeto en particular.
Incrementando el contador de referencias.

El contador de referencias se inicia a 1 cuando creamos un objeto y asignamos su referencia. A partir de aqui existen varias formas de incrementar este contador, como asignar nuevas referencias al objeto, pasar el objeto a una funcion, esto es lo que se conoce como referencia local, o como cuando forma parte de otro objeto, por ejemplo un contenedor.

x = 'hola'
v = x

La declaracion x = ‘hola’ crea un nuevo objeto de tipo string y lo asigna a la variable x, por lo que el contador de referencias pasa a valer 1. Cuando el interprete llega a la declaracion v = x crea una nueva referencia al objeto, el mismo objeto que al que hace referencia x, esto quiere decir que no se crea un nuevo objeto para v. Lo unico que ocurre aqui es que el contador de referencias se incrementa en 1 por lo que ahora pasa a valer 2.

A continuacion se muestran varias formas de incrementar el contador de referencias como se dijo anteriormente.

>>> #Cuando se crea el objeto
>>> x = 'hola mundo'
>>>
>>> #Cuando creamos nuevas referencias
>>> v = x
>>>
>>> #Cuando lo pasamos dentro de una funcion
>>> f(x)
>>>
>>> #Cuando forma parte de un contenedor
>>> l = [4342, x, 'adios']

Decrementando el contador de referencias.

El caso mas comun y mas obvio de la decrementacion del contador de referencias es cuando una referencia queda fuera de ambito, esto suele ocurrir cuando una funcion termina de ejecutarse. Otro caso frecuente es cuando a una variable le asignamos otro objeto.

>>> x = 'hola mundo'
>>> y = x
>>> x = 3242

El contador de referencias se incrementa en 1 cuando se crea ‘hola mundo’ y se asigna a x. Despues se vuelve a incrementar al asignarle otra nueva referencia por medio de y = x. Para finalizar, el contador de referencias de ‘hola mundo’ vuelve a 1 por que x ahora hace referencia a otro objeto.

Otras formas de eleminar referencias a objetos es usando la declaracion del, cuando eliminamos el objeto de un contenedor y si el contador de referencias de dicho contenedor llega a cero, por ejemplo.

>>> #Cuando una referencia queda fuera de ambito, como cuando
>>> #termina de ejecutarse una funcion
>>>
>>> #Cuando destruimos explicitamente las referencias a los objetos
>>> del y
>>>
>>> #Cuando la referencia se le asigna a un nuevo objeto
>>> x = 'Bilbao'
>>>
>>> #Cuando explicitamente lo eliminamos de un objeto contenedor
>>> l.remove(x)
>>>
>>> #Cuando el propio contenedor deja de tener referencias
>>> del l

La delacaracion del elimina una referencia de un objeto y su sintaxis en la siguiente:

del obj1 [,obj2[,... objN]]

Por ejemplo, en el caso anterior del hace dos cosas:

* Elimina el nombre y del espacio de nombres actual.
* Decrementa el contador de referencias de x en 1.

Por lo que se ha visto hasta aqui, ejecutar del eliminara las referencias de un objeto, decrementara el contador de referencias hasta cero y hara que el objeto sea inacesible. Este es el momento en el que el objeto es el candidato perfecto para pasar al recolector de basura. No siempre que ejecutamos del eliminamos todas las referencias a un objeto, ya que cualquier tipo de dubuging por ejemplo, podra almacenar otras referencias a dicho objeto.


El recolector de basura.

El recolector de basura es una pieza de codigo que busca objetos que no tengan referencias, tambien es el responsable de mirar y comprobar aquellos objetos que aun teniendo una o mas referencias deben ser desasignados. Esto es por ejemplo lo que ocurre con los ciclos.

Una referencia ciclica es cuando tenemos al menos dos objetos que tiene referencias entre si e incluso cuando todas las demas referencias ya no existen, estas siguen existiendo, esto quiere decir que solo el uso del contador de referencias no nos sirve.

El recolector de basura de Python es una combinacion del contador de referencias y llamadas periodicas al recolector de basura ciclico. Cuando el contador de referencias de un objeto llega a cero, el interprete se detiene para desasignar las referencias del objeto y tambien las de todos los objetos que solo puedan ser alcanzados por este. Como complemento a este proceso, el recolector de basura tambien notifica si han sido asignados un gran numero de objetos, o si no han sido asignados, a traves de la cuenta de referencias. En ambos casos, el interprete se detendra para intentar borrar cualquier ciclo no referenciado.
  #4 (permalink)  
Antiguo 13/06/2008, 13:17
Avatar de elquique  
Fecha de Ingreso: marzo-2004
Ubicación: Florida, Uruguay
Mensajes: 2.495
Antigüedad: 20 años, 1 mes
Puntos: 78
Respuesta: Python y el recolector de basura

Buena info JuanBellas igualmente comparto la idea de que el recolector es para recolectar lo que nos olvidamos de prevenir, o al menos eso es lo que muchos piensan y siempre es mejor organizar bien el código, y evitar cargas y basurillas para el recolector :)
__________________
Blog Jorge Oyhenard | Tutoriales Photoshop
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:47.