¿Debería elegir Java o Python para su próximo proyecto? ¿Eres lo suficientemente afortunado de tener una opción? ¿Es uno de estos idiomas una mejor opción?
Según el informe anual Octoverse de GitHub, Java y Python son el segundo y el tercer idioma más populares por cuarto año consecutivo. De acuerdo con la misma historia, Python es uno de los diez idiomas con mayor crecimiento en el mundo. La mayoría de los otros ganadores rápidos son lenguajes nuevos, mientras que Python ha existido por más tiempo que Java.
Al momento de escribir, el índice TIOBE coloca a Java en la parte superior de su lista y Python en el número tres. Python subió un lugar este mes (diciembre de 2018), luego de ocupar el puesto número cuatro durante más de un año.
La reciente encuesta de idiomas de Digital Ocean coloca a Python en el número dos de su lista de idiomas para proyectos de código abierto. Java está en el cuarto lugar, con solo la mitad de la adopción de Python.
Entonces, los dos idiomas son populares y no van a ninguna parte. ¿Cuál es tu mejor opción?

Java vs. Python en 2019

Java y Python tienen muchas similitudes. Ambos idiomas tienen un fuerte soporte multiplataforma y extensas bibliotecas estándar. Ambos tratan (casi) todo como objetos. Ambos lenguajes se compilan a bytecode, pero Python (generalmente) se compila en tiempo de ejecución. Ambos son miembros de la familia Algol, aunque Python se desvía más de C / C ++ que Java.
El soporte para Python 2.x finalizará el 1 de enero de 2020. Durante mucho tiempo, el desarrollo de Python se ha fragmentado entre la versión 2.7 y las versiones regulares de las nuevas versiones 3.x. Pero, con la fecha de finalización de la vida útil de Python 2 a un año de distancia, la pregunta sobre qué versión usar está resuelta. La comunidad se ha centrado en Python 3.
Mientras tanto, el nuevo modelo de lanzamiento de Oracle para Java creó mucho miedo, incertidumbre y dudas en la comunidad de software. A pesar de que el anuncio proporcionó una opción gratuita (como en Beer) y una ruta de actualización clara, la confusión continúa reinando . Varios proveedores de plataformas, como Red Hat y Amazon, han intervenido para admitir OpenJDK. Pero la comunidad de Java, una vez unificada, está más fragmentada que Python. Echemos un vistazo más de cerca a las similitudes y diferencias entre Java y Python.

Java vs Python escribiendo

Python y Java son lenguajes orientados a objetos, pero Java usa tipos estáticos, mientras que Python es dinámico. Esta es la diferencia más significativa y afecta la manera en que diseña, escribe y resuelve problemas de programas de una manera fundamental. Veamos dos ejemplos de código.
Primero, en Python, crearemos una matriz con algunos datos y la imprimiremos en la consola.
stuff = ["Hello, World!", "Hi there, Everyone!", 6]
for i in stuff:
print(i)
A continuación, intentémoslo en Java.
public class Test {
public static void main(String args[]) {
String array[] = {"Hello, World", "Hi there, Everyone", "6"};
for (String i : array) {
System.out.println(i);
}
}
}
En Python, colocamos dos cadenas y un entero en la misma matriz y luego imprimimos el contenido. Para Java, declaramos una lista de cadenas y ponemos tres valores de cadena en ella.
No podemos mezclar tipos en una matriz de Java. El código no compilará.
 String array[] = {"Hello, World", "Hi there, Everyone", 6};
Podríamos declarar que la matriz contiene Objeto en lugar de Cadena, y anular el sistema de tipos de Java. Pero, no es así como cualquier desarrollador de Java experimentado utiliza el lenguaje.
En Python, no tenemos que proporcionar un tipo cuando declaramos la matriz y podemos poner lo que queramos en ella. Depende de nosotros asegurarnos de no tratar de hacer un mal uso de los contenidos.
Por ejemplo, ¿qué pasa si modificamos el código anterior para hacer esto?
stuff = ["Hello, World!", "Hi there, Everyone!", 6]
for i in stuff:
print(i + " Foobar!")
El código anterior generará un error cuando intentemos ejecutarlo ya que no podemos agregar un entero con una cadena. ¿Cuáles son las ventajas y desventajas de la escritura dinámica y la escritura estática?
La escritura estática detecta errores de tipo en el momento de la compilación. Por lo tanto, si la mezcla de cadenas y enteros no fuera lo que quería hacer, el compilador de Java detecta el error. La ventaja de los controles en tiempo de compilación está sujeta a debate en algunos círculos . Pero, la escritura estática impone una disciplina que algunos desarrolladores aprecian.
Si la escritura estática evita errores o no, hace que el código se ejecute más rápido. Un compilador que trabaje con código de tipo estático puede optimizar mejor para la plataforma de destino. Además, evita errores de tipo de tiempo de ejecución, lo que agrega otro aumento de rendimiento.
El código que se escribe con tipos dinámicos tiende a ser menos detallado que los lenguajes estáticos. Las variables no se declaran con tipos, y el tipo puede cambiar. Esto guarda una copia o conversión de tipo a nuevas declaraciones de variables.
La cuestión de la legibilidad del código surge a menudo cuando se debate Java vs. Python. Echemos un vistazo a eso a continuación.

Código legible y formato

Tomemos un ejemplo de Java y Python y comparémoslos. En este ejemplo, necesitamos abrir un archivo de texto grande y recopilar cada línea en conjuntos de 50 registros separados por comas. Aquí está el código de Python:
def get_symbols(file_name):
with open(file_name, "r") as in_file:
records = []
count = 0
symbol_set = ""
for line in in_file:
symbol_set = symbol_set + line[:-1] + ','
count = count + 1
if count % 50 == 0:
records.append(symbol_set)
symbol_set = ""

symbols.append(symbol_set)
return records
Aquí está el código de Java:
List<String> getSymbols(String filename) throws IOException {
List<String> records = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
String line;
int count = 0;
StringBuilder symbol_set = new StringBuilder();
while ((line = reader.readLine()) != null) {
symbol_set.append(line).append(",");
count++;
if ((count % 50) == 0) {
records.add(symbol_set.toString());
symbol_set.setLength(0);
}
}
records.add(symbol_set.toString());
return records;
}
}

Espacio en blanco

El espacio en blanco es parte de la sintaxis de Python, mientras que Java lo ignora. Python usa pestañas para anidar y dos puntos completos para iniciar bucles y bloques condicionales. Java ignora los espacios en blanco y usa puntos y comas, paréntesis y llaves. Los argumentos sobre qué código es más fácil de leer, como el debate sobre la escritura estática frente a la dinámica, son subjetivos. Algunos dicen que el código de Python es más conciso y uniforme que Java porque sus opciones de formato son más limitadas. El uso del espacio en blanco por parte de Python termina los debates sobre cómo dar formato al código. La única opción que te queda es cómo usar líneas en blanco.
El fragmento de código de Python es unas pocas líneas más corto que el fragmento de código de Java, una diferencia que se suma en programas más grandes. Gran parte de la diferencia es porque no hay llaves de cierre. Pero la brevedad de Python, en comparación con Java, es más profunda.

Brevedad

Veamos cómo los dos idiomas manejan archivos.
Aquí está Python de nuevo:
with open(file_name, "r") as in_file:
Aquí está Java:
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
En ambos casos, la declaración crea un bloque. El recurso de archivo permanece en el alcance y los idiomas lo cierran cuando el código sale del bloque.
En Python, estamos abriendo un archivo y leyendo. Cuando el bucle llega al final del archivo, el bucle sale.
for line in in_file:
Java es más complicado. Estamos abriendo un BufferedReader pasándole un FileReader. Consumimos líneas del lector. Es nuestra responsabilidad verificar si el archivo finaliza.
while ((line = reader.readLine()) != null) {
Esto solo demuestra que es más fácil manejar archivos de texto en Python. Pero, demuestra cómo Java tiende a ser más detallado que Python. Las construcciones "pitónicas" son más concisas y menos exigentes. Java ha evolucionado en los últimos lanzamientos, con la introducción de try-with-resources en Java 7 y lambdas en Java 8, pero sigue siendo un lenguaje detallado.
Repasemos nuestro primer ejemplo.
Aquí está el Python de nuevo:
stuff = ["Hello, World!", "Hi there, Everyone!", 6]
for i in stuff:
print(i)
Aquí está el Java:
public class Test {
public static void main(String args[]) {
String array[] = {"Hello, World", "Hi there, Everyone", "6"};
for (String i : array) {
System.out.println(i);
}
}
}
Ambos de estos fragmentos se construirán y ejecutarán como están. Python ejecutará una secuencia de comandos de principio a fin de un archivo. Java requiere al menos un punto de entrada, un método estático llamado main. La JVM (máquina virtual Java) ejecuta este método en la clase que se le pasa en la línea de comandos.
Reunir un programa Python tiende a ser más rápido y más fácil que en Java. Esto es especialmente cierto para los programas de utilidad para manipular archivos o recuperar datos de recursos web.

Actuación

Tanto Java como Python se compilan en bytecode y se ejecutan en máquinas virtuales. Esto aísla el código de las diferencias entre los sistemas operativos, haciendo que los idiomas sean multiplataforma. Pero hay una diferencia crítica. Python generalmente compila el código en tiempo de ejecución, mientras que Java lo compila de antemano y distribuye el bytecode.
La mayoría de las JVM realizan una compilación justo a tiempo para todos o parte de los programas en código nativo, lo que mejora significativamente el rendimiento. Mainstream Python no hace esto, pero sí algunas variantes como PyPy .
La diferencia en el rendimiento entre Java y Python a veces es significativa en algunos casos. Una simple prueba de árbol binario se ejecuta diez veces más rápido en Java que en Python.

Reflexiones finales sobre Java vs. Python

Entonces, ¿qué idioma es tu mejor opción?
El nuevo modelo de soporte de Oracle cambia el panorama de Java. Si bien todavía hay una opción gratuita, el nuevo programa de lanzamiento y el modelo de soporte les da a los desarrolladores una razón para hacer un inventario. Los clientes de Java deberán pagar a Oracle por el soporte, cambiar las versiones de OpenJDK de forma regular o confiar en terceros como Red Hat o Amazon para las correcciones y actualizaciones de seguridad.
Al mismo tiempo, Python ha superado un obstáculo importante con Python 3. Python tiene un modelo de soporte más unificado que Java por primera vez, y los desarrolladores de código abierto están centrando sus esfuerzos en la última versión del lenguaje. Tengo que darle a Python la ventaja aquí.
Si la tipificación dinámica de Python es mejor que el enfoque estático de Java es subjetivo. El debate entre los dos modelos es anterior a ambos, y es una cuestión de qué es lo mejor para usted y su equipo.
Después de trabajar en grandes proyectos en ambos idiomas, me siento seguro al decir que la sintaxis de Python es más concisa que la de Java. Es más fácil ponerse en marcha rápidamente con un nuevo proyecto en Python que en Java. Python gana de nuevo.
El rendimiento es donde Java tiene una ventaja sustancial sobre Python. La compilación justo a tiempo de Java le da una ventaja sobre el rendimiento interpretado de Python. Si bien ninguno de los lenguajes es adecuado para aplicaciones sensibles a la latencia, Java sigue siendo mucho más rápido que Python.
A fin de cuentas, las ventajas de Python superan las desventajas. Si aún no lo estás considerando, dale otra mirada.
En cualquier proyecto, ya sea que elija Python o Java, asegúrese de que esté libre de errores con la Plataforma Raygun. Raygun detecta automáticamente los errores y los problemas de rendimiento con la sofisticada supervisión de errores, la supervisión real del usuario y la supervisión del rendimiento de la aplicación.