Explíqueme cuál es el problema con la optimización de llamadas de cola y por qué Python lo necesita

Aparentemente, ha habido un gran alboroto sobre si Python necesita o no la optimización de llamadas de cola. Esto llegó a un punto crítico cuando alguien le envió a Guido una copia de SICP porque no lo ” entendió “. Estoy en el mismo barco que Guido. Entiendo el concepto de optimización de llamadas de cola. Simplemente no puedo pensar en ninguna razón por la cual Python realmente lo necesita .

Para que esto me resulte más fácil de entender, ¿podría alguien darme un fragmento de código que se simplificaría enormemente utilizando el TCO?

Personalmente, pongo gran valor en la optimización de llamadas de cola; pero principalmente porque hace que la recursión sea tan eficiente como la iteración (o hace de la iteración un subconjunto de recursión). En lenguajes minimalistas, obtienes un gran poder expresivo sin sacrificar el rendimiento.

En un lenguaje ‘práctico’ (como Python), OTOH, normalmente tiene muchas otras construcciones para casi todas las situaciones imaginables, por lo que es menos crítico. Siempre es algo bueno tener, para permitir situaciones imprevistas, por supuesto.

Si desea intensamente utilizar la recursión para cosas que, alternativamente, se pueden express como bucles, entonces la “optimización de la llamada de cola” es realmente una necesidad. Sin embargo, Guido, el dictador benevolente para la vida de Python (BDFL), cree firmemente en que los bucles se expresen como bucles, por lo que no va a llamadas de cola de casos especiales (sacrificando volcados de stack y depuración de regularidad).

La optimización de llamadas de cola facilita la escritura de funciones recursivas sin preocuparse por un desbordamiento de stack:

def fac(n, result=1): if n > 1: return fac(n - 1, n * result) return result 

Sin la optimización de la llamada de cola, llamar a esto con un número grande podría desbordar la stack.

He estado pensando en su pregunta durante años (créanlo o no …). Estaba tan profundamente involucrado en esta pregunta que finalmente escribí un artículo completo (que también es una presentación de uno de mis módulos que escribí hace algunos meses sin tomarme el tiempo para escribir una explicación precisa de cómo hacerlo). Si todavía está interesado en esa pregunta, lea mi respuesta en mi blog . En dos palabras, doy una presentación del módulo tco ; no encontrará nada que no pueda hacer sin la eliminación de la recursión de la cola, pero puede que le interesen mis pensamientos al respecto.

Sé que los meros enlaces no son el uso preferido en Stackoverflow; No obstante, tenga en cuenta que escribí un artículo completo para responder a esta publicación (a la que me refiero en el cuerpo de mi artículo) e incluye también algunas imágenes para ilustrarlo. Por esta razón, publico aquí esta respuesta inusual.

Guido reconoció en una publicación de seguimiento que el TCO permitía una implementación más limpia de la máquina de estados como una colección de funciones que se llamaban recursivamente. Sin embargo, en el mismo post, él propone una solución alternativa más limpia sin TCO.