- ¡Python 3.12 ya está disponible! Incluye nuevas características y mejoras de rendimiento (algunas de las cuales son proporcionadas por Meta) que creemos beneficiarán a todos los usuarios de Python.
- Compartimos detalles sobre estas nuevas funciones en las que trabajamos estrechamente con la comunidad de Python para desarrollar.
El episodio de esta semana Pitón 3.12 Marca un hito importante en nuestros esfuerzos por desarrollar y escalar Python para casos de uso Meta. más accesible para la comunidad Python en general. El código abierto en Meta es una parte importante de nuestro trabajo y de compartir conocimientos con la comunidad.
Hemos estado compartiendo nuestro trabajo en Python y CPython durante varios años a través de nuestro tiempo de ejecución de Python de código abierto. Ceniza. También trabajamos estrechamente con la comunidad de Python para introducir nuevas características y optimizaciones para mejorar el rendimiento de Python y permitir que terceros experimenten más fácilmente con optimizaciones del tiempo de ejecución de Python.
Con el lanzamiento de Python 3.12, colaboramos con la comunidad de Python en varias categorías de características:
- Objetos inmortales
- Mejoras en el sistema de tipos
- Optimización del rendimiento
- Nuevos hitos
- Ganchos para escoria
Objetos inmortales
Objetos inmortales – PEP 683 le permite crear objetos Python que no están involucrados en conteo de referenciay vivirá hasta que salga el intérprete de Python. motivación original El objetivo de esta función era reducir el uso de memoria al bifurcar la carga de trabajo del servidor web de Instagram al reducir la cantidad de copias sobre escritura causadas por las actualizaciones del recuento de enlaces.
Los objetos inmortales también son un paso importante hacia objetos Python verdaderamente inmutables que se pueden compartir entre intérpretes de Python sin necesidad de bloquearlos, como el uso de un bloqueo de intérprete global (GIL). varios subintérpretes o Multihilo sin GIL.
Mejoras en el sistema de tipos
El equipo de ingeniería detrás HogueraSe creó e implementó un verificador de tipo Python de código abierto. PEP 698 agregar @escribiendo.override un decorador que ayuda a evitar errores al refactorizar jerarquías de herencia de clases que utilizan la anulación de métodos.
Los desarrolladores de Python pueden aplicar este nuevo decorador a un método de subclase que anula un método de clase base. Como resultado, los verificadores de tipos estáticos podrán advertir a los desarrolladores si la clase base se cambia de tal manera que el método anulado ya no exista. Los desarrolladores pueden evitar convertir accidentalmente una anulación de método en código inactivo. Esto aumenta su confianza en la refactorización y ayuda a que su código sea más fácil de mantener.
Optimización del rendimiento
Comprensión más rápida
En versiones anteriores de Python, todas las comprensiones se compilaban como funciones anidadas y cada ejecución de una comprensión asignaba y destruía un objeto de función de Python único.
En Python 3.12 PEP 709 incorpora todas las listas, dictados y conjuntos para mejorar la productividad (hasta dos veces en el mejor de los casos).
La implementación y depuración de PEP 709 también reveló un error en el compilador de código de bytes preexistente que podría causar que el código se ejecutara silenciosamente de manera incorrecta en Python 3.11, que es lo que hicimos. fijado.
Tareas asincrónicas impacientes
Si bien el soporte de programación asincrónica de Python proporciona paralelismo de proceso único, también introduce una notable sobrecarga en el tiempo de ejecución. Cada llamada a función asincrónica crea un objeto de rutina adicional, y la biblioteca asyncio estándar a menudo introduce una sobrecarga adicional como Tarea objetos y planificación del ciclo de eventos.
Hemos notado que en la práctica, en una base de código totalmente asíncrona, muchas funciones asíncronas a menudo pueden devolver un resultado inmediatamente sin necesidad de hacer una pausa. (Esto puede estar relacionado con la memorización, por ejemplo). En estos casos, si el resultado de la función se espera inmediatamente (p. ej. espera a some_async_func(), (la forma más común de llamar a una función asincrónica), los objetos de rutina/tarea y la programación de bucles de eventos pueden suponer una sobrecarga innecesaria.
Cinder elimina esta sobrecarga mediante la ejecución asincrónica activa. Si se espera una llamada a una función asincrónica inmediatamente, se llama con un conjunto de indicadores que le permite devolver el resultado directamente, si es posible, sin crear un objeto de rutina. Si asincrónicamente.recopilar() se espera de inmediato, y todas las funciones asíncronas que recopila pueden regresar de inmediato, sin necesidad de crear nunca Tarea o programarlo en un bucle de eventos.
La ejecución completamente asíncrona sería un cambio invasivo (e importante) en Python y no funciona con el nuevo Python 3.11+. Tarea grupal API para gestionar tareas paralelas. Entonces, en Python 3.12 agregamos una versión más simple de esta función: tareas asincrónicas impacientes. En el caso de tareas impacientes, los objetos de rutina y Tarea aún se crean cuando el resultado está disponible de inmediato, pero a veces podemos evitar programar una tarea en el bucle de eventos y resolverla de inmediato.
Es más eficiente, pero es un cambio semántico, por lo que esta función suscríbete a través de la fábrica de tareas personalizadas.
Otras mejoras de asincio
También aterrizamos más rápido Implementación en C de asyncio.current_task Y optimización para crear una tarea asincrónica muestra gane hasta un 5 por ciento en pruebas asincio.
Más rápido súper() llamadas
Nuevo Código de operación LOAD_SUPER_ATTR optimiza el código del formulario super().attr Y super().método(…). Anteriormente, dicho código tenía que asignar y luego descartar un «súper» objeto único cada vez que se ejecutaba. Ahora tiene un poco más de sobrecarga que una llamada a un método normal o un acceso a atributos.
Otras optimizaciones de rendimiento
También conseguimos dos hasattr mejoramiento Y Mejora del rendimiento 3,8 veces mayor para unittest.mock.Mock.
Nuevos hitos
Cuando optimizamos Python para uso interno en Meta, generalmente podemos probar y validar nuestras optimizaciones directamente en cargas de trabajo reales. El trabajo de optimización de Python de código abierto no requiere tal carga de trabajo para las pruebas y debe ser eficiente (y evitar la regresión) bajo una variedad de cargas de trabajo.
Conjunto de pruebas de rendimiento de Python es un conjunto estándar de pruebas utilizadas en la optimización de Python de código abierto. Durante el ciclo de desarrollo de la versión 3.12, le agregamos varias pruebas nuevas para reflejar con mayor precisión las características de la carga de trabajo que vemos en Meta.
Agregamos:
Ganchos para escoria
Algunas partes de Cinder (nuestro compilador JIT Y Python estático) no tendría sentido como parte del CPython original (debido al soporte limitado de la plataforma, C vs. C++, cambios semánticos y tamaño del código), por lo que nuestro objetivo es empaquetarlos como un módulo de extensión CinderX independiente.
Esto requiere una serie de interceptores nuevos en el tiempo de ejecución principal. Agregamos muchos de estos ganchos en Python 3.12:
Estas mejoras serán útiles para cualquiera que cree un compilador JIT de terceros o un optimizador de tiempo de ejecución para CPython. También hay planes para utilizar observadores dentro del kernel CPython.
Más allá de Python 3.12
Python juega un papel importante en Meta. Esta es una parte importante de nuestra infraestructura, incluyendo Pila de servidores de Instagram. Y esta es la lengua franca para nuestro trabajo en el campo de la inteligencia artificial y el aprendizaje automáticoDestacado por nuestro desarrollo. PyTorchun marco de aprendizaje automático para una amplia gama de casos de uso, incluida la visión por computadora, el procesamiento del lenguaje natural y más.
Nuestro trabajo con la comunidad Python no termina con el lanzamiento de la versión 3.12. Actualmente estamos discutiendo una nueva propuesta. PEP 703, con el Consejo Orientador de Python elimine el GIL y permita que Python se ejecute en varios subprocesos en paralelo. Esta actualización puede ser de gran ayuda para cualquiera que utilice Python en un entorno de subprocesos múltiples.
La participación de Meta en la comunidad Python también se extiende más allá del código. En 2023 continuamos nuestro apoyo Programa de desarrollador residente de Python y eventos patrocinados como Picón EE.UU.. También compartimos nuestros conocimientos en conversaciones como «Rompiendo los límites: avances en inteligencia artificial de alto rendimiento y aprendizaje automático con el compilador Python PyTorch» Y Publicaciones del blog de metaingeniería.
Estamos agradecidos de ser parte de esta comunidad de código abierto y esperamos trabajar juntos para hacer avanzar el lenguaje de programación Python.
Expresiones de gratitud
El autor desea agradecer a las siguientes personas por sus contribuciones a todas estas nuevas funciones: Eddie Elizondo, Vladimir Matveev, Itamar Oren, Stephen Troxler, Joshua Xu, Shannon Zhu, Jacob Bauer, Pranav Thulasiram Bhat, Ariel Lin, Andrew. Frost y Sam Gross.