¿Cuáles son los pros y los contras de usar Python vs. Java?

Resumen ejecutivo: Python mejor para programas cortos / creación de prototipos, Java mejor para grandes proyectos / material de misión crítica. Los detalles siguen.

Uso Python y Java a diario, mezclando y combinando según las necesidades. Cada vez más, mi flujo de trabajo es un prototipo en Python, luego migro a Java una vez que tenemos el diseño correcto, resolvimos los problemas.

Python es mucho más rápido para crear prototipos. Cosas como la programación funcional, las listas como primitivas de primer orden, los valores de retorno de tupla, el tipeo “duck” y el hecho de que la consola está disponible para depurar fácilmente y probar rápidamente realmente le da una ventaja. Python es mi lenguaje de “1000 líneas”: es lo que uso para proyectos que esperan tener alrededor de 1000 líneas de largo. Funciona bien para tareas de procedimiento. También es muy conciso.

Sin embargo, Python no escala tan bien como Java para proyectos grandes. Java es mi lenguaje de programación de “100,000 líneas”: lo que usé para estructuras de datos complicadas, servicios de misión crítica, etc. Su escritura estática realmente lo hace más manejable a grandes escalas de código; o donde está creando “juegos de herramientas” que necesitan ser reutilizados para implementar una amplia gama de funcionalidades, o en muchas aplicaciones. Con Python, obtendrá AttritbuteError: None, y no sabrá exactamente qué hacer con él.

Java es más detallado que Python, pero vale la pena, es más legible. Además, las herramientas y los IDE (por ejemplo, Eclipse, NetBeans, IntelliJ, etc.) son increíblemente buenos para Java, porque Java fue diseñado para el análisis estático. Python, menos. IDLE está bien, pero no está en el calibre de las herramientas.

Java también es verdaderamente multiplataforma. He escrito bibliotecas en Java que se ejecutan en ambos teléfonos Android con RAM pequeña, y también se ejecutan en centros de datos de 10,000 máquinas, con cada máquina con Xeons y 20GB + de RAM. Eso es algo asombroso.

Las bibliotecas principales de Java son muy sólidas y proporcionan una base excelente para cosas como las aplicaciones GUI. Python tiene algunas opciones para GUI, pero no he encontrado que sean tan sólidas.

Finalmente, en términos de rendimiento, Java es claramente el ganador del rendimiento, no tan rápido como C ++, pero en la mayoría de los casos no es más de 1.2x o 1.3x más lento. Por supuesto, esto es confuso, hay cosas como Jython y PyPy, pero en primer lugar eliminan algunas de las ventajas de usar Python.

Las ventajas de Java sobre Python son:

  1. Los programas Java se ejecutan más rápido en comparación con Python.
  2. Las aplicaciones Java son mucho más estables y seguras en comparación con Botha s, básicamente se ejecutan en un entorno virtual aislado que es la JVM.
  3. Puede manejar fácilmente conjuntos de datos muy grandes y trabajar de manera eficiente.
  4. Las aplicaciones de Java son mucho más escalables.
  5. Si está trabajando con bases de datos, JDBC y ODBC en Java pueden ayudarlo fácilmente, mientras que en Python las capas de acceso a la base de datos están un poco subdesarrolladas.
  6. Este punto puede no ser cierto para todos, pero personalmente me resulta extremadamente difícil depurar los errores de sangría de Python. Mientras que las llaves de Java son muy fáciles de detectar y rectificar. Básicamente, mover el código de la edición en un IDE a otro es una pesadilla.

Ahora para los profesionales de Python sobre Java:

  1. Los códigos Python son mucho más compactos y más fáciles de comprender en comparación con los códigos Java.
  2. La curva de aprendizaje de Python es fácil y puede ofrecer algunos programas bastante complejos en cuestión de líneas.
  3. Python se escribe dinámicamente y no hay necesidad de declarar nada. Una declaración de asignación vincula directamente un nombre a un objeto, y el objeto puede ser de cualquier tipo.
  4. Python se ha convertido en la columna vertebral de Internet de las cosas. De hecho, el Pi en la Raspberry Pi significa Python.
  5. Un gran conjunto de herramientas para el análisis de datos, la investigación científica está escrita en Python 2, que actualmente se está reescribiendo y actualizando a Python 3.
  6. La característica de integración de Python hace posible llamar a Python a través de Java a través de Jython.

Uso Python y Java a diario para desarrollar servicios de back-end. Para los servicios que principalmente hacen IO, Python parece una mejor opción y
para servicios intensivos en CPU, Java es una mejor opción debido a su velocidad y recolección de basura superior. Sin embargo, no todos los casos de uso pueden necesitar la velocidad bruta proporcionada por JVM. Para esos python puede ser una mejor opción.

Pros (Python)

  • Es mucho más rápido desarrollar / depurar en python.
  • Tiene construcciones poderosas como rendimiento, decoradores, etc. de las que carece Java. Estas construcciones ayudan a expresar algunas de las lógicas complejas de una manera mucho más simple y elegante. (por ejemplo, ORM: pruebe Hibernate y SQLAlchemy).
  • Proporciona marcos asíncronos simples y potentes (eventlet / gevent) para desarrollar servicios de backend escalables. En java, debe ir con servicios de subprocesos como tomcat / jetty (los nuevos proporcionan soporte asíncrono limitado) o usar bibliotecas de estilo de reactor construidas sobre Java NIO como Netty. Ninguno de estos se acerca a la expresividad de python.

Los siguientes son algunos de los casos de usos del mundo real que pueden considerarse antes de rechazar ciegamente Python por razones de rendimiento.

  • Amazon S3 (Java) vs Rackspace CloudFiles / Openstack (Python). Amazon S3 puede ser el más popular de los dos. Pero nunca he visto problemas relacionados con el rendimiento / escalabilidad informados en Rackspace CloudFiles. Openstack (swift) también es utilizado por otros proveedores de hosting.
  • Servicios de mozilla.
  • Empresas como Youtube, Yelp, Dropbox, etc.
  • Mercurial (Python) vs git (C): Mercurial ofrece un rendimiento decente y hay casos en los que mercurial supera a git en el rendimiento.

Contras (Python)

  • Bloqueo global del intérprete y falta de otros mecanismos de concurrencia para usar CPU de múltiples núcleos: GIL evita la ejecución paralela de subprocesos en CPU de múltiples núcleos. Para los softwares alojados (web / en la nube), este no es un problema grave, ya que el estado debe almacenarse fuera de la caja y los subprocesos no agregarán mucho valor. Pero para los softwares empresariales basados ​​en dispositivos donde el software necesita ESCALAR, es mucho mejor diseñar softwares de manera multiproceso que multiproceso. Para tales casos de uso, las utilidades multiproceso y concurrentes de Java son una verdadera bendición.
  • Recolección de basura: el recolector de gargabe de Python se basa en el umbral y no hace compactación. No tiene una programación basada en el tiempo. Esto a veces puede ser un problema para aplicaciones de servidor de larga ejecución.
  • Python puede no ser la opción correcta para algunos de los algoritmos intensivos de CPU.
  • Puede que Python no sea la opción correcta para algunos softwares internos de la estructura, como chatserver / messagequeue, que deben ampliarse en una sola casilla.
  • Java tiene un soporte de biblioteca mucho mejor para algunos de los casos de uso. (por ejemplo, SNMP. Python tiene otros similares. Pero, en cuanto a las características, no se encuentran en comparación con las librerías de Java)

Python pros

Léelo, úsalo con facilidad. “Las características principales de un programa Python es que es fácil de leer”, dice Pierre Carbonnelle, un programador y blogger de Python que ejecuta el índice de lenguaje PyPL.

Python es fácil de usar y extremadamente popular en la academia, creando un gran grupo de talentos, dice Sumit Chachra, CTO de Tivix, una firma de consultoría de software que se especializa en el desarrollo de Python / Django. Tivix aprovecha Django y Python en el desarrollo web y móvil, dice.

Internet de las cosas oportunidades. Python puede volverse popular para Internet de las cosas, ya que las nuevas plataformas como Raspberry Pi se basan en él, dice Carbonnelle. La documentación de Raspberry Pi cita el lenguaje como “un lenguaje de programación maravilloso y poderoso que es fácil de usar (fácil de leer y escribir) y con Raspberry Pi le permite conectar su proyecto al mundo real”.

Beneficios de codificación asincrónica. Python, dice Deibel, “es excelente para escribir código asincrónico, que en lugar de enhebrar utiliza un solo bucle de eventos para trabajar en unidades pequeñas”.

El enfoque multiparadigma supera a Java. El enfoque de programación de Python no es tan limitado como el de Java, dice Carbonnelle. “Por ejemplo, no necesita crear una clase OO para imprimir ‘Hola mundo’ en Python, tiene que hacerlo en Java”.

Contras de Python

La velocidad puede ser un problema. “Debido a que es un lenguaje interpretado, a menudo es mucho más lento que los idiomas compilados”, dice Curtin. “Sin embargo, se trata de separar el lenguaje del tiempo de ejecución. Ciertos puntos de referencia del código Python ejecutado bajo PyPy se ejecutan más rápido que el código C equivalente u otros”.

Ausencia de informática móvil y navegadores. “Python está presente en muchas plataformas de servidor y escritorio, pero es débil en informática móvil; muy pocas aplicaciones de teléfonos inteligentes se desarrollan con Python”, dice Carbonnelle. “También rara vez se ve en el lado del cliente de una aplicación web”.

Restricciones de diseño. Los devotos de Python citaron varios problemas con el diseño del lenguaje. Debido a que el lenguaje se escribe dinámicamente, requiere más pruebas y tiene errores que solo aparecen en tiempo de ejecución, dice Chachra.

Pros y contras de Java

A uno de los autores le tomó poco más de dos días completar un prototipo funcional del sistema, con su tiempo dividido aproximadamente por igual entre la implementación del modelo de pila Java y el script de traducción, y la escritura de los métodos vectoriales. Desde este punto de vista, el experimento fue claramente un éxito: rápidamente tuvimos un sistema de trabajo que nos permitió ejecutar código N en cualquier plataforma Java.

En términos de características del lenguaje, las clases de pila y matriz de Java fueron de gran ayuda en la creación rápida de prototipos, y la recolección de basura incorporada en el lenguaje significaba que no teníamos que adaptar el código de conteo de referencias utilizado por el intérprete VCODE. No explotamos las características orientadas a objetos de Java; no hay herencia, y muy poca composición de objetos. En esencia, utilizamos Java como un dialecto portátil de C con recolección de basura y una buena colección de estructuras de datos preexistentes.

Algunos aspectos de Java ralentizaron tanto el proceso de desarrollo como el código generado. Sin plantillas, polimorfismo paramétrico o un preprocesador incorporado, es imposible generar versiones eficientes de tipo especializado del mismo método básico desde el propio Java. Aunque es útil para la creación de prototipos, la clase de pila estándar de Java es limitante ya que permite la manipulación solo del elemento en la parte superior de la pila, mientras que VCODE requiere la capacidad de operar en múltiples elementos en posiciones arbitrarias en la pila. En términos de rendimiento en tiempo de ejecución, la creación de matrices Java es relativamente costosa, ya que se definen para que se llenen con el valor nulo apropiado para su tipo. Este requisito provoca un bucle implícito sobre la matriz, aunque la inicialización es innecesaria para las matrices que se escribirán antes de ser leídas. Finalmente, debido a que Java es un lenguaje joven, hay pocos datos de rendimiento disponibles para tomar decisiones informadas de diseño y optimización.

Sin embargo, es fácil de resolver o solucionar la mayoría de estos problemas. Podríamos haber usado un preprocesador externo como la herramienta Unix m4 para generar múltiples versiones especializadas en tipos de cada método vectorial.

Python o Java. Una gran pregunta para la mayoría de los programadores principiantes. Ambos lenguajes de programación son realmente buenos y vastos de codificar. Aunque tienen muchas diferencias, tienen similitudes como OOP, etc.

Entonces, ¿cómo se comparan estos dos idiomas? Vamos a desglosarlo por categoría.

Velocidad

Aunque el rendimiento no siempre es un problema en el software, siempre debe considerarse. Cuando dominan los costos de E / S de la red o el acceso a la base de datos, la eficiencia específica de un lenguaje es menos significativa que otros aspectos de la elección y el diseño de la tecnología cuando se trata de la eficiencia general.

Aunque ni Java ni Python son especialmente adecuados para la informática de alto rendimiento, cuando el rendimiento es importante, Java tiene la ventaja por plataforma y por diseño. Aunque algunas implementaciones de Python, como PyPy, están ajustadas para el rendimiento, el rendimiento portátil sin procesar no es donde brilla Python.

Gran parte de la eficiencia de Java proviene de las optimizaciones para la ejecución de máquinas virtuales. Una JVM puede traducir bytecode en código de máquina nativo a medida que se ejecuta un programa. Esta compilación Just-In-Time (JIT) es la razón por la cual el rendimiento de Java a menudo puede rivalizar con el de los idiomas nativos. Confiar en JIT es una suposición razonablemente portátil, ya que HotSpot, el Oracle JVM predeterminado, lo ofrece.

Java ha tenido soporte para la concurrencia desde su primera versión pública, mientras que Python es más decididamente un lenguaje secuencial. Esto tiene implicaciones para aprovechar las tendencias actuales del procesador multinúcleo, con el código Java más fácilmente capaz de hacerlo. El Global Interpreter Lock (GIL) en la implementación dominante de Python, CPython, se interpone en el camino de dicha escala. Existen implementaciones de Python sin restricción de hits, pero confiar en ellas puede interferir con algunos de los supuestos de portabilidad que sustentan el código de Python.

Legado

A menudo, la elección del idioma no se trata del diseño y las cualidades intrínsecas del lenguaje en sí. Existen idiomas para crear código, y ese código tiene un contexto en los negocios, la economía, la historia, la arquitectura de software, las habilidades y la cultura de desarrollo.

Los sistemas heredados tienen inercia en torno a sus tecnologías actuales. Los cambios seguirán más fácilmente el camino ya establecido, cambiando gradualmente e incrementalmente en lugar de reescribir y revolucionar. Por ejemplo, una base de código existente de Python 2 es más probable que encuentre una nueva oportunidad de vida en Python 3 que en una reescritura. Es probable que el back-end de un proyecto empresarial Java existente aumente su funcionalidad con más código Java, quizás migrando a una versión más actual del lenguaje, o agregando nuevas características en otros lenguajes JVM como Scala y Groovy.

La historia de Java en la empresa y su estilo de codificación ligeramente más detallado significa que los sistemas heredados de Java suelen ser más grandes y numerosos que los heredados de Python. Por otro lado, las organizaciones pueden sorprenderse al descubrir cuántos de los scripts y el código de pegamento que mantienen unida su infraestructura de TI están formados por Python. Ambos idiomas tienen un problema heredado, pero generalmente se presenta de manera diferente.

Agilidad práctica

La cultura y las tendencias de desarrollo han beneficiado tanto a Java como a Python. En virtud de publicaciones que han utilizado Java como su lengua franca y herramientas que se centraron en trabajar con Java, a menudo se considera que Java tiene una asociación más estrecha con el desarrollo ágil y su comunidad. Pero ninguna comunidad es estática y tan fácil de definir. Python siempre ha tenido presencia en el espacio ágil y ha crecido en popularidad por muchas razones, incluido el surgimiento del movimiento DevOps.

Java disfruta de un soporte de refactorización más consistente que Python gracias, por un lado, a su sistema de tipo estático que hace que los refactorizados automáticos sean más predecibles y confiables, y por otro lado, a la prevalencia de IDEs en el desarrollo de Java (IntelliJ, Eclipse y NetBeans, por ejemplo). El sistema de tipo más dinámico de Python fomenta un tipo diferente de agilidad en el código, centrándose en la brevedad, fluidez y experimentación, donde Java es quizás visto como una opción más rígida. Sin embargo, ese mismo tipo de sistema puede ser un obstáculo para la refactorización automática en Python. La cultura pitónica favorece una amplia gama de editores en lugar de estar basada en IDE, lo que significa que hay menos expectativas de un fuerte soporte de refactorización automatizado.

La temprana popularidad de JUnit y su asociación con el desarrollo basado en pruebas (TDD) ha significado que, de todos los lenguajes, Java disfruta quizás del entusiasmo más constante de los desarrolladores por las pruebas unitarias de cualquier lenguaje. La inclusión automática de JUnit en IDEs ha ayudado, en gran parte.

Dicho esto, los orígenes de Python en las secuencias de comandos y la inclusión de características de prueba en su biblioteca estándar significan que Python no es ajeno al énfasis en las pruebas automatizadas que se encuentran en el desarrollo moderno, aunque es más probable que sea la integración en lugar de las pruebas unitarias.

Recursos humanos

A veces, la elección del idioma se trata más de la aplicación de habilidades que de las propias aplicaciones de software. La dotación de personal puede contar para algo más que el diseño del lenguaje y las herramientas. Si el idioma ideal para el trabajo es aquel en el que nadie tiene habilidades, y nadie quiere habilidades, entonces probablemente no sea el idioma ideal para el trabajo después de todo. Por otro lado, si los desarrolladores están dispuestos a adoptar una nueva tecnología, todas las demás cosas son iguales, esta puede ser una razón suficiente para ir con esa tecnología. En el mundo de Java, la píldora de una base de código Java heredada a menudo se puede endulzar adoptando otro lenguaje JVM, como usar Groovy o Clojure para pruebas automatizadas, o salir completamente del universo Java, como usar Python para manejar el lado de operaciones el sistema.

Otro aspecto de la cuestión de la dotación de personal es el mercado de habilidades. Tanto Java como Python son incondicionales de la lista de los 10 principales de la popularidad del lenguaje de programación TIOBE Index. Java ha sido consistentemente más popular que Python, pero Python ha experimentado el mayor crecimiento de los dos idiomas, retomando dónde están cayendo Perl y Ruby.

Siguiendo la idea de que una de las mayores influencias tanto en la elección personal como en el interés laboral es ir con lo que sabes, ambos idiomas tienen una sólida posición en la educación, con Java más utilizado en los cursos universitarios y Python en la escuela secundaria. Los graduados actuales de TI tienen uno o ambos de estos idiomas en su currículum casi por defecto.

Arquitectura

Las habilidades y los sistemas y opciones de software existentes informan los lenguajes de programación utilizados en cualquier arquitectura de software dada. La arquitectura de software también es cuestión de marcos y bibliotecas, reutilización e integración. En muchos casos, las tecnologías que las personas quieren aprovechar son las que dictan la elección del idioma y no al revés. Una arquitectura de software concebida en torno a un marco web Python no llegará lejos con un equipo de desarrollo exclusivo de Java.

Tanto Java como Python disfrutan de un suministro aparentemente interminable de bibliotecas de código abierto pobladas por código de individuos y empresas que han resuelto problemas comunes y poco comunes, y que están felices de compartir para que otros puedan aprovechar sus soluciones. De hecho, ambos idiomas se han beneficiado de, y han sido moldeados por, foros en línea y desarrollo de código abierto.

Cuando se han tenido en cuenta las cuestiones de legado, reutilización, rendimiento y habilidades de desarrollo, algunas decisiones arquitectónicas aún pueden dejar abierta la elección del lenguaje. Por ejemplo, el aumento de las arquitecturas de microservicios (donde los sistemas con conexión a Internet se dividen en pequeños procesos cooperativos) hacen que la elección del lenguaje sea más un detalle localizado que una consideración dominante en un proyecto.

A pesar de toda la diversidad presente en el panorama de la programación moderna y sus arquitecturas de software, algunos equipos y empresas prefieren reducir algunas de sus opciones tecnológicas en lugar de vivir con un revoltijo de decisiones pasadas y caprichos personales. Pero la consolidación puede reducir las opciones, por lo que no es una decisión que deba tomarse a la ligera. Vale la pena estar atento a las tendencias en idiomas y marcos para evitar tomar el camino equivocado en el camino.

Conclusión

Java y Python están en él a largo plazo. Junto con sus comunidades de desarrollo, han evolucionado y se han adaptado desde la década de 1990, encontrando nuevos nichos y reemplazando otros idiomas, a veces compitiendo en el mismo espacio. Ambos lenguajes están asociados con la apertura, por lo que las empresas, los equipos y los desarrolladores son los mejores para tener una mente abierta a la hora de tomar una decisión.

Prefiero el lenguaje Python, pero prefiero Java para las tareas diarias.

Python es ideal para bastantes tareas, pero el aprendizaje inicial es desafiante para la mayoría de los desarrolladores debido a la falta de llaves y la sangría como requisito de lenguaje. El código es casi siempre limpio y conciso. Es fácil leer y comprender un script de Python una década después de lo que escribió, y comprender cuál era su proceso de intención y pensamiento. Python tiene decoradores. Los decoradores son la característica principal que deseo que Java admita (estoy ignorando AOP [1] porque el lenguaje no lo admite por defecto). Python, aunque multiplataforma, tiene algunas características no compatibles con Windows, viceversa, por lo que el desarrollo multiplataforma requiere más flexibilidad. Python, aunque admite múltiples subprocesos, no lo hace bien con el bloqueo global de intérpretes [2].

Java es bueno para la mayoría de las tareas. Sobresale en algunos, es adecuado en casi cualquier cosa, es mi navaja suiza que funciona más en cualquier lugar. Su soporte multiplataforma es excelente. Su multihilo es bueno.

Me encanta el lenguaje Python, pero uso Java para la flexibilidad. Ah, y Maven es lo que PIP quiere ser cuando crezca y se convierta en un verdadero administrador de dependencias.

Notas al pie

[1] Programación orientada a aspectos – Wikipedia

[2] GlobalInterpreterLock – Python Wiki

Python es mucho más simple, más fácil de aprender y más fácil de escribir. Dado que es un lenguaje dinámico, no necesita escribir detalles de bajo nivel, como el tipo de cada variable o la longitud de las matrices, por ejemplo. Los programas de Python son más cortos y requieren menos repetitivo. El código es más legible, más parecido al inglés y más sucinto.

Otra ventaja de python es que no necesita compilar el código antes de ejecutarlo. El intérprete lo ejecuta de inmediato, e incluso puede usar el shell interactivo para probar, explorar y experimentar mientras codifica.

Java, por otro lado, es un lenguaje estático. Significa que su código debe compilarse antes de ejecutarse. Entonces no tienes la interactividad que obtienes con Python y su intérprete. Además, debe declarar todos los tipos por adelantado y proporcionar mucha más información en su código para que pueda compilarse con éxito.

La ventaja de Java es que todo este arduo trabajo generalmente vale la pena en forma de un rendimiento superior.

Python es más rápido y más fácil de escribir, pero más lento de ejecutar. Java es más “burocrático” y rígido, pero da como resultado un código más rápido.

Pros:

Python es más fácil de aprender y comenzar a codificar que Java. Se escribe dinámicamente para que los desarrolladores no tengan que preocuparse por el tipo de datos al declarar una variable o matrices. Tiene muchos soportes de biblioteca estándar para una codificación más corta y fácil.

Contras:

La mayor desventaja, es más lenta que Java. Esto es obvio porque Java es un lenguaje compilado y Python es interpretado. Python se escribe dinámicamente, por lo que debe encontrar más errores de tiempo de ejecución que Java.

Nota:

Hay otras ventajas y desventajas. El que usarás generalmente depende del problema que quieras resolver. Si está pensando en aprender el primer idioma, vaya con Java. En el futuro, Python no será un problema para aprender y usar.

Python: creas un módulo de armas, una clase de armas, un módulo de pie y una clase de pie. Después de darse cuenta de que no puede apuntar la pistola al pie, pasa una referencia a la pistola a un objeto de pie. Después de volar el pie, el objeto del arma permanece vivo por toda la eternidad, listo para disparar a todos los pies futuros que puedan aparecer.

Java: encuentra que Microsoft y Sun han lanzado bibliotecas de clases incompatibles, ambas implementando objetos Gun. Luego descubre que aunque hay muchos objetos de pies implementados en el pasado en muchos otros idiomas, no puede acceder a uno. Pero viendo que Java es tan genial, no te importa y andas disparando cualquier otra cosa que puedas encontrar.

Para más visita Probytes

Simplemente consulte mi blog y lo entenderá. Le ayudará a comprender los pros y los contras no solo de Java y Python, sino también de muchos otros lenguajes de programación: los 10 lenguajes de programación más importantes

Espero que esto te ayude 🙂