Comprueba por ti mismo la potencia de Python frente a C++

pc

Muchos son los programadores o futuros programadores que se enfrentan al momento de elegir lenguaje para su proyecto. Es bastante habitual la duda entre C++ o Python.

La respuesta siempre es: C++ = potencia, Python = facilidad de uso.

La verdad es que, leyendo un poco el lenguaje, se puede entrever que la facilidad de uso de Python y ahorro de tiempo va a ser sustancial. No obstante, saber cuanta velocidad vamos a perder en nuestra aplicación a menudo no se ve clara a simple vista.

Pues bien, futuro programador, haz este simple ejercicio. Vamos a crear un programa muy simple en C++ y en Python.

Código C++:

 

#include <iostream>

using namespace std;

int main()
{
    int t = 0;

    while (t < 100000000) {
        t++;
    }

    cout << t << endl;

    return 0;
}

Código Python:

 

#!/usr/bin/env python

t = 0

while t < 100000000:
    t = t + 1

print t

El programa es muy simple y el problema habitual en ciertas áreas, como la programación de juegos, por ejemplo. Simplemente hemos creado un bucle que, uno a uno, suma cien millones (dicho así parece más de lo que es) a una variable y sale del programa.

Ejecuta ambos. ¿Qué notas? Comprobarás que C++ realiza la tarea de manera instantánea a la vista, mientras que Python se toma alrededor de 10 segundos (depende del procesador que tengas). Concretamente, el comando «time» de Linux me muestra un tiempo de ejecución del programa de 0,003 segundos para la versión en C++ y de 12,873 segundos para la versión en Python.

Visto esto, sirva para esclarecer al futuro programador la elección de lenguaje. Si el programa va a ser sencillo y no vas a usar este tipo de cálculos, seguramente Python será la mejor opción. En caso contrario, C++ puede ser la elección más acertada.

ACTUALIZACIÓN DE LA ENTRADA 8/01/11

Dicen que de sabios es rectificar y yo a menudo he de hacerlo. Este post es una clara muestra de un pensamiento pasado que ya no comparto.

Primero: el pequeño programa de muestra no demuestra casi nada. Un programa en C++ va a ser más eficiente que en Python siempre y cuando escribamos nuestras propias rutinas y algoritmos nosotros mismos. No obstante, Python incluye «pilas», rutinas para múltiples funciones que nos van a ahorrar un montón de tiempo, pero mucho mucho, y que en muchas ocasiones serán más eficientes que las que nosotros pudiéramos llegar a codificar, sobre todo como programadores noveles. Total, que una aplicación que realicemos en Python puede terminar siendo más veloz que la que realizaríamos en C++, y, además, la tendremos lista en menos tiempo. A mayores, Python incluye recolección de basura, lo que nos evitará problemas de memoria, sobre todo cuando un programa comienza a crecer demasiado, y también nos libera mucho tiempo que podemos emplear en centrarnos en lo realmente interesante que ha de hacer el programa.

Segundo: con todo, me he dado cuenta de que este post no esclarece, en absoluto, la elección de lenguaje para afrontar un proyecto. Lamentándolo mucho, creo que es un tema más complicado de lo que parece. Según lo que un programador quiera crear, va a necesitar un lenguaje u otro. El tema es aprender, al menos por encima, a usar unos cuantos lenguajes antes de ponerse manos a la obra. Un segundo tema es que, a menudo, un proyecto se va a basar en algún framework determinado (un motor de juegos en concreto -como puede ser SDL, XNA, Irrlicht, etc.-, una API concreta -GTK+, QT, Win32, WxWidgets, etc.- u otros). El framework elegido tal vez ya nos condicione el tipo de lenguaje a utilizar, aunque algunos permiten trabajar desde diferentes lenguajes; en realidad, llegados a este punto, la potencia de la aplicación la marca el framework, y no tanto el lenguaje que usemos, por lo que, simplemente, deberemos escoger el que más cómodo nos parezca. Por último, a veces, incluso la mejor opción pasa por crear la mayor parte del proyecto en un lenguaje y usar otro para determinadas funciones.

Tercero: estamos hablando de la creación de programas tradicionales, de ejecución en local. La programación web tiene sus propios lenguajes que van mejor que los comentados para su cometido (PHP, ASP, Java, JavaScript…) y así otras áreas. Cada tipo de aplicación y destino tiene su o sus lenguajes que facilitan el trabajo, cuando intentarlo con otros sería toda una odisea.

Ha pasado el tiempo y a día de hoy, para un programador novel, recomendaría comenzar con un lenguaje con recolección de basura y una sintaxis clara. C#, al que siempre tenía manía, resulta que ahora me gusta bastante. Muchos de los programadores experimentados creen que se debería comenzar con un lenguaje como C antes de pasarse a uno más «automático», para aprender bien las bases de como funciona un programa y el sistema operativo internamente. Sin embargo, ¿acaso cuando aprendemos matemáticas comenzamos por las integrales? No, comenzamos por lo sencillo, sumas y restas, y vamos ampliando conocimientos gradualmente. Creo que con la programación ocurre lo mismo. Podemos empezar por un lenguaje de sintaxis clara y sin preocupación por punteros y gestión de memoria, y más tarde, una vez dominado lo básico (bucles, funciones, objetos, etc.), profundizar en otros aspectos tanto si lo necesitamos como si nos parece conveniente. Si bien Python es un lenguaje sencillo, usado actualmente por muchos para iniciar a la gente en programación, me gusta más uno con sintaxis similar a C, ya que hay muchos lenguajes que se basan en la sintaxis de C, de cerca o de lejos, tales como Java, C#, JavaScript, C++, PHP…, y esto facilita el futuro cambio de uno a otro.

12 comentarios el “Comprueba por ti mismo la potencia de Python frente a C++

  1. Yo soy programador. Me dedico principalmente a programar en C y Python, sobre todo a bajo nivel, y tengo muy claro que hay cosas que se pueden hacer en C/C++ pero no en Python. También tengo claro que el manejo de cadenas en C es espantoso (no tanto en C++, claro), y en Python es mucho más llevadero.

    Después de muchos años he llegado a la conclusión de que cuando alguien afirma tajantemente que un lenguaje es mejor que otro, no está siendo objetivo. Se puede ver en los miles de flames que se montan en la Red: Erlang vs. C++, Haskell vs. Lisp, Perl vs. Python, C++ vs. C#, Java vs. C…

    Al final la única conclusión es que los lenguajes son herramientas, y nadie utiliza una sierra para clavar clavos.

    • Manuel,
      ¡esos son los comentarios que a mí me gustan! :)

      La verdad es que lejos está en mi post la intención de comparar ambos lenguajes ni de iniciar ningún «flamewar» (en muchos casos, incluso Visual Basic es la mejor opción). Mi intención es la de esclarecer, de una forma visual directa y sencilla, la pérdida de rendimiento, a fin de que cada persona lo tenga claro y en cuenta de cara al tipo de proyecto que quiera afrontar, sobre todo cuando hablamos de programadores noveles o algo perdidos.

      A grandes rasgos, Python se va a desenvolver bien y nos va a facilitar el trabajo en aplicaciones sencillas que no requieran potencia de cálculo, incluso en el desarrollo de juegos de escritorio tipo puzzle o pequeños plataformas.

      La elección de uno u otro lenguaje a menudo es una decisión difícil de tomar, así que sirva mi post simplemente para ayudar a tomar esa decisión.

      Saludos :) (:

      • Sí, entiendo que no has querido comparar ambos lenguajes. Lo último que haría sería meterme en el enésimo flame sobre qué es mejor, si la carne o el pescado ;)

        De todos modos te dejo un par de apuntes. Uno, que ese hándicap de Python se debe sobre todo a la propia naturaleza interpretada del lenguaje (no olvidemos que C++ es compilado), y se están haciendo esfuerzos, sobre todo desde Google que es la empresa «mecenas» de Python, para mejorar el rendimiento del lenguaje. Dos, que a pesar de que el rendimiento no es generalmente muy alto, Python se utiliza en entornos científicos con alta demanda de cálculo. Creo que el proyecto se llama SciPy o algo así.

        Y nada más. Me alegro de que haya gente de habla hispana con interés en la programación :)

    • Hola, me llamo Aldo. Yo estudio y aprendo lenguaje C con un profesor y Python con otro. Nunca he hablado con ellos sobre el primer proyecto que quiero hacer. Me gustaria programar algo interactivo y educativo para los niños de escuelas primarias. Queria saber su opinion, ¿Lo programo con Python o con C?
      El motivo por el cual estudio dos lenguajes es porque estudio dos carreras diferentes, Electromecanica y la otra es Mecatronica, la idea de las carreras universitarias es para programar robots, maquinas, sistema operativo de una computadora de un automovil, etc.

  2. Yo usé C, VB6, C#, y Python. Es decir, aprendí con C, me mal acostumbré con VB6, me curé con C# y me enamoré de Python.
    Me fascinó Python desde que lo empecé a usar pero es llamativa la complejidad que conlleva hacer cosas que son muy sencillas de hacer en la mayoría de los lenguajes (private variables, propiedades readonly, declaración explícita obligatoria de variables, etc.).
    Hoy estuve viendo algo de Boo y me pareció excelente pero con poco apoyo de la comunidad, creo que si Python toma ese rumbo no lo supera nadie.
    Un saludo para todos.
    (perdón pero es muy tarde y no tengo muchas ganas escribir, creo que se nota je je)

  3. Actualmente estoy probando un compilador que se llama vala, que se aloja bajo el alero de Gnome, este compilador que no es un verdadero compilador transforma 2 tipos de lenguajes a elección del usuario y lo transforma a lenguaje C , luego lo compila.
    estos lenguajes son:
    _vala, cuya sintaxis es similar a C#
    _genie cuya sintaxis es similar a Python ,muy sencillo e intuitivo
    la velocidad de ejecución es muy similar a la de C, por lo tanto es rapidisimo
    en ubuntu es mas rapido que fortran, pascal, java y cualquier otro lenguaje interpretado

  4. Buen post, justo lo que buscaba…
    Actualmente estoy haciendo un pequeño proyecto con la raspberry 2B y «raspicam» con 2 servomotores. El caso es que programaba un reconocimiento facial con la cam y esta seguia el rostro usando los servos, todo esto programado en PYTHON luego de terminarlo me lleve la sorpresa que era muy lento al rededor de 4 fps, luego fui optimizando ( bajandole la resolucion de video) hasta que alcance unos 8-9 fps.

    Ahora quiero rehacerlo en c++ y ver si puedo tener una captura en tiempo real mas fluida
    Gracias por el post
    Saludos desde Colombia

  5. Necesito ayuda gurus. Esoty haciendo botenes y ventanitas con Tkinter en Python nada complicado, todos los programas corren bien sin problemas. Me gusta hacer cosas con el puerto paralelo (El antiguo y muerto LTP de las impresoras que me sirve todavÍa) Y lo que quiero hacer es que cuando mande o reciba datos desde o al puerto paralelo se refleje en las ventasnas de Tk Inter. Ya tengo resuelto mandar y recibir datos al palalelo en Lenguaje C, de hecho funcionan bien mis programas y enciendo mis 8 leds conectados al paralelo (con su respectiva alimentaciòn bien conectado para no estropear la mother), solo quiero enviar un dato, por ejemplo: 00001111 al puerto paralelo y que se grafique los 8 botoncinos que corren e TKinter. ¡Como jalo las rutinas d e TK Inter y las uso en Lenguaje C?. No se si me explique.

    Botones en TkInter mostrando los datos enviados/recibidos al LTP.

    Tengo en Lenguaje C int main(void) mandar datos –> 0011

    Tengo mi botenera en TkInter
    v0=Tk()
    v0.resizable(0,0)
    v0.title(«Datos D0 — D7″)
    Button(v0,width=6,height=3,text=»ON»).grid(row=0,column=0)
    Button(v0,width=6,height=3,text=»Led 1″,bg=’red’).grid(row=0,column=2)
    Button(v0,width=6,height=3,text=»Led 2″,bg=’cyan’).grid(row=0,column=3)
    Button(v0,width=6,height=3,text=»Led 3″,bg=’dark violet’).grid(row=0,column=4)
    Button(v0,width=6,height=3,text=»Led 4″,bg=’gold’).grid(row=0,column=5)
    Button(v0,width=6,height=3,text=»Led 5″,bg=’tan’).grid(row=0,column=6)
    Button(v0,width=6,height=3,text=»Led 6″,bg=’chocolate’).grid(row=0,column=7)
    Button(v0,width=6,height=3,text=»Led 7″,bg=’rosy brown’).grid(row=0,column=8)
    Button(v0,width=6,height=3,text=»Led 8″,bg=’magenta’).grid(row=0,column=9)
    v0.mainloop()

    No se como unir los codigos..
    Como meto el còdigo de TkInter o cmo lo llamo desde Lencguaje C, como lo inserto?

    Gracias.

Escribe tu comentario :)

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.