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++.

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)

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 (2^7); más o menos el límite que se piensa mentalmente en una competencia (Floyd-Warshall corre en O(N^3) por lo que 2^21 \approx 10^6 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.


  • Juan Manuel Lallana

    No soy amante de python ni mucho menos pero esa comparación es muy subjetiva. Python tiene sus puntos flojos pero hay muchas tareas en la que un programa en C++ puede llevarne menos del 5% de de diferencia de velocidad.

    Fuera de eso es una injusticia medir la velocidad de un lenguaje interpretado con uno compilado.

    Aparte

    hola mundo en C++

    #include
    using namespace std;

    int main() {
    cout << "¡Hola, mundo!" << endl;
    return 0;
    }

    tamaño 4Kb

    hola mundo en python

    print "¡Hola Mundo!"

    tamaño 20bytes.

    Ahi tenes otra comparación totalmente injusta. Casi tanto como la de velocidad de ejecución.

    En cuanto a la portabilidad. Definitivamente no tener que recompilar en python es un gol para el mismo, pero la disponibilidad de biliotecas c/c++ es mucho mayor. En python solo blindings.

    No existe un ganador entre python y c++. Son cosas totalmente diferentes aunque se usen para lo mismo.

    Es solo la opinion de un noob :D espero que cuanto entre de nuevo me encuentre con correcciones asi puedo perder un poco de mi ignorancia :D

  • http://estebanordano.com.ar/ eordano

    Estimado Juan Manuel:

    Concuerdo en todo lo que decís.

    Esta comparación era para (ilusamente) ver si Python podía ser eficiente, lo suficientemente eficiente como para que no nos importen las constantes que agrega no tener todo en código máquina.

    Justamente en un post anterior, escribí un programa no tan trivial como el hola mundo, pero trivial de todas maneras, que me llevó menos tiempo programar en Python que en C++ (a pesar de que había aprendido Python esa misma semana).

    Saludos,
    Esteban

  • Pablo Alejandro Costesich

    La herramienta que un desarrollador elije son determinadas por las prioridades más altas del proyecto y las limitaciones más prominentes. C++ y Python cumplen propósitos distintos a escala general y están pensados para situaciones distintas, así que ninguna comparación va a ser "justa" desde el punto de vista neutral, eso es obvio.

    Como explicaste en la primer parte, el punto del análisis es el balance. Si sos un developer que habla C++ mejor que el Español entonces un análisis de herramientas te va a servir de poco. Para la mayoría de los mortales la elección está más determinada por el lado donde tengas que hacer menos trabajo.

    Ejemplo: Para codear un servidor de páginas web en C++ puede que necesite buscar librerías que no conozca y tenga problemas de dependencias, mientras que en Python tengo BaseHTTPServer. Lo mismo pasa si quiero hacer un script para interactuar con una web: puedo gastar un rato largo viendo urllib y codeando mis propias opciones con optparse, preocuparme de tener python instalado donde lo vaya a usar y etcétera, o bien usar curl.

    Podría poner un ejemplo con el tema de arduino C++ vs. atmega C puro, pero el mundo de los microcontroladores es totalmente distinto y seguro que te aburro. :P