Go vs Python: cómo elegir

Cuando se trata de facilidad y conveniencia para el desarrollador y de acelerar la velocidad del desarrollo, dos lenguajes de programación se elevan por encima del paquete: Python y Go. Hoy en día, Python es un pilar de scripts, devops, aprendizaje automático y pruebas, mientras que Go impulsa la nueva ola de computación nativa de la nube basada en contenedores.

A veces, la elección entre Python y Go es obvia: elija Python por su rico ecosistema, elija Go por su velocidad de ejecución. Pero a veces la elección no es tan obvia. En este artículo, analizaremos las diferencias clave entre los dos idiomas y destacaremos los pros y los contras para ayudarlo a elegir el idioma correcto para el trabajo en cuestión.

Go vs.Python: conveniencia para desarrolladores

Python y Go comparten la reputación de ser conveniente trabajar con ellos. Ambos lenguajes tienen una sintaxis simple y directa y un conjunto de funciones pequeño y fácil de recordar.

Tanto Python como Go también tienen un ciclo corto de edición, compilación y ejecución. Python no tiene fase de compilación, se interpreta, por lo que los scripts se ejecutan casi de inmediato. Compila con anticipación, pero su fase de compilación es mucho más rápida que la de lenguajes como C ++. Go se siente más como un lenguaje de secuencias de comandos con el que trabajar que como un lenguaje compilado con anticipación.

Python utiliza funciones de escritura dinámica, lo que facilita la creación rápida de prototipos de aplicaciones. Etiquetar cosas con tipos es opcional y se puede hacer para imponer la corrección adicional del programa (una buena idea con proyectos grandes), pero nunca es obligatorio. Las bases de código más grandes pueden volverse difíciles de manejar sin tipos.

En el caso de Go, la escritura es estricta, pero se infiere fácilmente en la mayoría de los casos, por lo que es menos engorrosa. También significa que las bases de código más grandes son más fáciles de administrar desde el primer momento, porque los programadores de Go han seguido la tradición de usar tipos. Por otro lado, Go carece de genéricos, por lo que algunos tipos de código que se expresarían de manera más concisa en otros lenguajes, incluido Python, se vuelven más detallados y repetitivos en Go.

Go vs.Python: velocidad en tiempo de ejecución

Si hay un área en la que Go supera a Python, es la velocidad de ejecución. Go es un orden de magnitud o más rápido que Python, incluso sin ninguna optimización por parte del desarrollador. Go compila directamente en código de máquina nativo, mientras que el dinamismo en tiempo de ejecución de Python es difícil de optimizar para la velocidad.

Sin embargo, Python puede ser "lo suficientemente rápido" para muchas tareas comunes, por lo que vale la pena comparar una implementación de Python para su caso de uso. Muchos de los trabajos más intensivos en rendimiento para los que se usa Python no se ejecutan en Python en sí, sino a través de bibliotecas escritas en C o C ++. Además, el tiempo de ejecución de PyPy, un reemplazo directo del tiempo de ejecución de CPython convencional, puede proporcionar aceleraciones significativas para aplicaciones de larga duración como servidores web, incluso donde el dinamismo de Python se usa mucho.

Go vs.Python: implementación

Go fue diseñado desde el principio para permitir que las aplicaciones compiladas se implementen fácilmente como binarios independientes en múltiples plataformas. Python, por el contrario, se concibió originalmente como un lenguaje de secuencias de comandos, por lo que los programas de Python requieren el tiempo de ejecución de Python.

Python carece de una solución nativa para implementar un script como ejecutable independiente, pero puede recurrir a bibliotecas de terceros como PyInstaller para eso. Además, las soluciones de contenedor como Docker facilitan un poco el empaquetado de una aplicación Python con su tiempo de ejecución.

Go vs Python: gestión de proyectos

Otra ventaja incorporada a Go desde el principio: técnicas modernas de gestión de proyectos de software. Las acciones rápidas de la línea de comandos crean un nuevo repositorio de proyectos de Go y administran sus dependencias. Vale la pena señalar que Go no siempre ha tenido un buen soporte para dependencias y compilaciones reproducibles, pero el sistema de módulos, introducido en Go 1.11, ahora proporciona un mecanismo común para trabajar con diferentes versiones de bibliotecas.

De alguna manera, Python sufre el problema opuesto: una gran cantidad de herramientas de gestión de proyectos y control de versiones a menudo genera confusión sobre qué herramientas y métodos son los mejores para un trabajo determinado. En el lado positivo, también significa que no está obligado a hacer las cosas de una manera particular.

Go vs.Python: programación asincrónica

Las operaciones asincrónicas (ejecutar una tarea mientras se espera que se complete otra) ayudan a que el código vinculado a E / S, como los servicios de red, se ejecuten de manera más eficiente.

Go ha admitido async de forma nativa desde sus inicios mediante goroutines, una función de sintaxis del lenguaje. Goroutines le permite ejecutar muchas operaciones pequeñas en paralelo, con canales primitivos de comunicación nativos, para sincronizar operaciones entre ellos. Go también incluye herramientas para reducir el uso indebido accidental de esas funciones; aún puede escribir código que se bloquea o tiene condiciones de carrera, pero es fácil detectar los errores más comunes de ese tipo.

Python recientemente obtuvo soporte a nivel de lenguaje para el comportamiento asincrónico con las  async/await palabras clave. Antes de eso, la programación asincrónica era posible en Python, pero no sencilla. Eso significa que el soporte de la biblioteca para los modismos asíncronos de Python modernos no es tan avanzado como podría ser, ya que es un recién llegado al lenguaje. Pero el soporte está mejorando a medida que más bibliotecas se vuelven compatibles asíncronas y las versiones no asíncronas de Python dejan de ser compatibles.

Go vs. Python: manejo de errores y depuración

Python y Go tienen filosofías profundamente diferentes para el manejo de errores.

En Python, los errores son objetos de primera clase y se propagan por la cadena de llamadas de la aplicación cada vez que la aplicación lanza una excepción. Esto hace que el manejo de errores sea opcional, por lo que el programador debe decidir qué casos se manejarán y manejarlos manualmente. Del mismo modo, el enfoque de Python también hace posible escribir mecanismos de manejo de errores más flexibles que no abarroten cada sitio de llamadas.

Con Go, cada función devuelve el valor de la función en sí, así como un posible objeto de error. Los programas Go suelen tener anotaciones explícitas sobre posibles condiciones de error en los sitios de llamadas a funciones, por lo que el código tiene un manejo de errores inequívoco. La desventaja de esto es el código detallado. Go también tiene las  panic/recoverpalabras clave para manejar situaciones extremas que justifican la eliminación total del programa, aunque, por supuesto, no están destinadas a usarse tan profusamente como las excepciones de Python. Go 2.0 puede presentar nuevos mecanismos de manejo de errores que reducen la verbosidad, pero esa revisión del lenguaje aún está muy lejos.

Go vs.Python: pruebas

No todo el desarrollo de software moderno se basa en pruebas unitarias y de integración, pero los proyectos que lo hacen son más sólidos. Go y Python proporcionan mecanismos nativos para pruebas unitarias. Para Go, está el testing paquete nativo  . Para Python, está el  unittest marco. 

Go incluye métricas de cobertura de pruebas como parte de  testing; con Python, necesita un paquete de terceros  coverage, para determinar qué tan completo será su conjunto de pruebas. Por otro lado, Python tiene opciones de prueba incorporadas altamente flexibles para complementar su dinamismo; por ejemplo, tiene afirmaciones para verificar una amplia gama de condiciones comunes, incluidas las excepciones planteadas. Python también usa una clase para distinguir el código de prueba del código de la aplicación, mientras que Go usa las convenciones de nombres de funciones y archivos.

Go vs.Python: ecosistemas

A lo largo de los años, Python y Go han recopilado impresionantes bibliotecas de software de terceros a su alrededor que reflejan sus casos de uso y fortalezas.

Python ha sido durante mucho tiempo el lenguaje de referencia para la creación de scripts y la automatización, así como para la creación de servicios web y la creación de interfaces fáciles de usar entre sistemas complejos. Esta última categoría es la forma en que Python ha llegado a dominar la ciencia de datos y el aprendizaje automático: Python facilita unir las bibliotecas y los flujos de trabajo grandes y complejos que se utilizan en el análisis de datos avanzado y los modelos de aprendizaje automático.

Las historias de éxito de Go giran en torno a sus funciones de programación asíncrona y su velocidad nativa del sistema. Los servidores web, las aplicaciones de red, los microservicios vinculados a la CPU y las utilidades del sistema son excelentes candidatos para Go. La mayor parte del software que impulsa el desarrollo de aplicaciones modernas basadas en contenedores, incluidos Docker y Kubernetes, está escrito en Go.

Una forma de decidir si elegir Go o Python es ver qué proyectos existentes escritos en ellos se parecen a su esfuerzo actual. Existe una buena posibilidad de que gran parte de lo que está intentando construir ya haya sido creado por otra persona, por lo que puede elegir no solo el idioma, sino también las bibliotecas de apoyo que se ajusten.

Finalmente, no hay nada que diga que no puede escribir tanto en Python  como en Go. Puede usar Go para partes de su aplicación sensibles al rendimiento y proporcionar contenedores o interfaces de Python para la conveniencia y comodidad del desarrollador.