Revisión: Python vs C++
Fecha: September 22nd, 2009 | Categoría: Python | 3 Comments »Update a http://estebanordano.com.ar/bajo-nivel-c-vs-alto-nivel-python/
Últimamente estuve programando más en Python que en C++. Ahora, con algo más de conocimiento tanto de Python como de C++ y algoritmos, me planteé revisar el blogpost. A ver si están mal esos dos ordenes de magnitud... tengo la esperanza de que sea menor esa diferencia abismal.
Creo que tiene mucho sentido hacerse la pregunta "¿Cuánto estoy perdiendo de performance por ser cómodo y programar en un lenguaje de mayor nivel?" por lo que plantean algunos en la web de que "programmer time is more expensive than hardware", entonces, programá lo más rápido y tal vez ineficiente que puedas, y después tirale hardware al problema. No creo que esté bien esto, pero un término medio si; usar lenguajes más cómodos y despreocuparse por constantes me parece más correcto.
Lo que programé en ambos lenguajes es un simple BFS, (breath-first-search) para atravesar un digrafo y sacar la distancia desde el nodo 0 hasta cada otro nodo. Uso una simple cola.
El código no es exactamente el mismo, en Python usé las famosas listas pythonicas, que si no sé exactamente cómo están implementadas (creo que con hashs), por lo que creo que es asintóticamente mayor a la complejidad pensada O(V+E) del BFS en C++.
Después hice algo más de arrays y matrices, tiré un Floyd-Varshall... acá sí me encontré con una diferencia de performance tremenda... por los fucking accesos random a memoria...
Código en Python: grafo.py
Código en C++: grafo.cpp
Generador de casos
Script para generar y correr los casos de prueba
Código en Python: Floyd.py
Código en C++: Floyd.cpp
Generador de casos - Floyd
Script para generar y probar los casos (Floyd)
Script para las gráficas (Octave)
Resultados
BFS:

Performance de C++ vs Python. Aparenta que Python crece igual asintóticamente que C++, pero en un segundo vistazo, crece más rápidamente que C++.
Floyd:

Performance de C++ vs Python. La curva de Python crece exponencialmente, la de C++ está muy por debajo y aparenta ser lineal (no parece despegarse del eje)
Conclusiones
Python pierde por goleada. En casos muy intensivos en accesos aleatorios sobre todo. Sin embargo, no todo está perdido, por ejemplo: Floyd-Warshall dejaba de ser computable rápidamente cuando tenia 128 nodos (
); más o menos el límite que se piensa mentalmente en una competencia (Floyd-Warshall corre en
por lo que
estaría en el límite de lo computable en una computadora del año 2000)
La diferencia de 2 órdenes de magnitud se mantuvo y aumentó incluso en los peores casos.
