martes, 27 de marzo de 2018

Python 3.x, que versión elegir




Estoy buscando la mejor versión de Python para afrontar un nuevo proyecto de machine-learning. Se trata de un proyecto muy ambicioso cuyo desarrollo se dilatará en el tiempo y que servirá también como laboratorio para ensayar la implementación de nuevas técnicas de IA. Es importante que la herramienta pueda perdurar sin tener que migrar, en mucho tiempo, a nuevas versiones de Python. He realizado un pequeño análisis para valorar cual será la mejor elección y he querido compartir este pequeño esfuerzo.

Empezaré describiendo los condicionantes que se han de cumplir:
  1. Debe ser compatible con Django 2.
  2. Debe ser compatible con la mayoría de las librerías importantes de machine-learning y matemáticas.
Antes de nada justificar la elección de 3.x y no de 2.x pero esto es inmediato si tenemos en cuenta que 2.7 tiene los días contados, concretamente el soporte finalizará en el 2020 y ya no habrá más versiones de 2.x. Una vez establecido este extremo pasamos a discutir los siguientes puntos:

1. Compatibilidad Django 2.

Como podemos ver aquí Django 2 solo es compatible con 3.x, concretamente nos ofrecen la siguiente tabla de compatibilidades:

 Django  Ptyhon
2.0:         3.4, 3.5, 3.6
2.1:         3.5, 3.6, 3.7

Ni Django 2.0 ni 2.1 son del tipo LTS, será la 2.2 la próxima LTS y como podemos ver nada se nos dice sobre la compatibilidad de Python para esta versión LTS, no obstante si confiamos en que continúen con la mima serie tendremos:

Django  Ptyhon
2.2:         3.6, 3.7, 3.8

Bajo este ángulo tenemos tres opciones, la 3.5, la 3.6 y la 3.7. Es evidente que la mejor opción en este caso es la 3.6 ya que por un lado 3.5 pierde su compatibilidad con la versión LTS (2.2) y la 3.7 necesita de la versión 2.1 de Django que saldrá en Agosto del 2018. 

La mejor elección: Python 3.6

2. Compatibilidad con librerías machine-learning.

En este apartado se incluyen todas las necesarias para el desarrollo de algoritmos y algunas muy recomendadas. A continuación una lista de las imprescindibles:

  1. Numpy: Paquete de para computación científica, imprescindible para afrontar cualquier problema matemático. La versión 1.14 requiere Python >= 2.7 pero es incompatible con 3.0, 3.1, 3.2, 3.3 y compatible con 3.4-3.6. Numpy 1.14 se ha compilado con Cython 0.26.1 que no es compatible con Python 3.7.
  2. Pandas:  Paquete para análisis de datos, totalmente imprescindible. Las versión 0.22 es compatible con 2.7, 3.5 y 3.6, por el momento no soporta 3.7.
  3. ScyPy: Totalmente imprescindible. Requiere Python >= 2.7 o Python >= 3.4, no dice nada respecto a Python 3.7. 
  4. SymPy: Matemáticas simbólicas. No es imprescindible pero si muy recomendada. La última versión 1.1.1 requiere Python 2.7, 3.3, 3.4, 3.5, 3.6.
  5. Matplotlib: Representación gráfica. No es imprescindible pero si muy recomendada. Python >= 2.7 o >= 3.4, no se dice nada respecto a 3.7.
  6. TensorFlow: API de Google para deep-learning. Muy recomendable.  Requiere 2.7 o 3.x.
  7. OpenCV: Para visión artificial. Muy recomendable. Soporta las siguientes versiones de Python:  2.7, 3.4, 3.5, 3.6. 
  8. Numba: Para correr nuestro código usando también la GPU. Muy recomendable. Sigue exactamente el mismo criterio de Numpy por lo que podemos decir que es compatible con 2.7 y 3.4-3.6 pero no es compatible con Python 3.7. 
  9. Python StatsModels: Para estadśitica. Imprescindible, requiere 2.7 o 3.x.  
La mejor elección: Python 3.6, Python 3.5 

Todo parece indicar que la mejor elección es Python 3.6, no obstante repasemos algunas de las mejoras de la versión 3.6 respecto a la 3.5:
  1. Se pueden usar guiones bajos para leer mejor los números grandes 1_000_250=1000250.
  2. Se introduce en el estándar la anotación de los tipos para las variables, listas, diccionarios y clases.
  3. Se puede usar await y async en las list, set, dict comprehensions.
  4. Se puede usar await y async en una misma función. 
  5. Se incorpora el módulo secret para generar números aleatorios válidos para criptografía.   
  6. Se agrega un nuevo protocolo file system path.
Parece que la inminente versión 3.7 de Python traerá mejoras considerables respecto a la depuración del código, sin embargo introducen un cambio en el manejo de las excepciones de tal manera que estas serán incompatibles con las versiones anteriores de Python.
Conclusión: La versión de Python 3.5 es compatible con todos los paquetes de machine-learning y aunque las mejoras de 3.6 con respecto a 3.5 no son espectaculares Python 3.5 dejará de ser compatible con la versión de Django 2.2. Por otro lado la versión 3.7 parece introducir muchas mejoras pero no estará disponible la versión estable hasta el verano del 2018. Por otro lado no es soportado por muchos paquetes debido a la notable diferencia al tratar las excepciones. Por todo ello parece que la mejor elección es Python 3.6.

No hay comentarios:

Publicar un comentario