es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué se almacenan en la pila (marco) las referencias a los valores de Python que son parámetros de función en CPython?

Python trabaja con el conteo de referencias. Esto significa que si no hay más referencias a un valor, entonces la memoria de ese valor es reciclada. En otras palabras, mientras exista al menos una referencia restante, el objeto no es eliminado y la memoria no es liberada.

Consideremos el siguiente ejemplo:

def myfn():                    
    result = work_with(BigObj()) # la referencia 1 a BigObj está en el marco de pila.
                                 # Todavía no contando ninguna
                                 # referencia dentro de la función work_with
                                 # después de que work_with devuelve: El marco de pila
                                 # y la referencia 1 son eliminados. la memoria de BigObj
                                 # es liberada
    return result             

def work_with(big_obj):       # aquí tenemos otra referencia a BigObj
    big_obj = None            # supongamos que necesitamos más memoria y que no
                              # necesitamos big_obj más
                              # la referencia dentro de work_with es eliminada. Sin embargo,
                              # todavía hay una referencia en la pila. Entonces la
                              # memoria no se libera hasta que work_with devuelve
    other_big_obj = BigObj()  # necesitamos la memoria para otro BigObj -> podemos quedarnos
                              # sin memoria aquí

Entonces mi pregunta es:

¿Por qué CPython mantiene una referencia adicional a los valores que se pasan a las funciones en la pila? ¿Hay algún propósito especial detrás de esto o es solo un detalle de implementación “desafortunado”?

Mi primera idea al respecto es:
Para evitar que el conteo de referencias caiga a cero. Sin embargo, todavía tenemos una referencia viva dentro de la función llamada. Entonces esto no tiene sentido para mí.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una posible razón por la que CPython mantiene una referencia adicional a los valores que se pasan a las funciones en la pila es para optimizar el rendimiento. Al mantener una referencia en la pila, CPython evita tener que realizar ciclos innecesarios de recolección de basura. Esto se debe a que si el recuento de referencias de un objeto llega a cero, CPython debe ejecutar su recolector de basura para liberar la memoria. Esta puede ser una operación costosa, especialmente si se realiza con frecuencia.

    Al mantener una referencia adicional en la pila, CPython puede asegurarse de que el recuento de referencias nunca llegue a cero mientras la función siga ejecutándose. Esto significa que el recolector de basura se puede posponer hasta después de que la función devuelve. Esto puede resultar en un mejor rendimiento y un menor uso de memoria.

    En general, aunque pueda parecer un detalle de implementación, mantener una referencia adicional a los valores pasados ​​a las funciones en la pila es en realidad una decisión de diseño deliberada destinada a mejorar el rendimiento.

Comments are closed.