Cinder de código aberto de Facebook, un fork de CPython usado por Instagram

Facebook publicou o código fonte do Proxecto Cinder, un fork de CPython 3.8.5, a principal implementación de referencia da linguaxe de programación Python. Cinder úsase na infraestrutura de produción de Facebook para alimentar Instagram e inclúe optimizacións para mellorar o rendemento.

O código publícase para discutir a posibilidade de levar as optimizacións preparadas ao marco principal de CPython e para axudar a outros proxectos implicados na mellora do rendemento de CPython. Facebook non pretende apoiar a Cinder en forma de proxecto de código aberto independente e o código preséntase na forma en que se usa na infraestrutura da empresa, sen peiteado e documentación adicional. Tampouco intentan promover Cinder como unha alternativa a CPython: o principal obxectivo do desenvolvemento é o desexo de mellorar o propio CPython.

O código Cinder é bastante fiable e probado en ambientes de produción, pero se se identifican problemas, terás que resolvelos ti mesmo, xa que Facebook non garante que responda ás mensaxes de erro externas e ás solicitudes de extracción. Ao mesmo tempo, Facebook non exclúe a cooperación construtiva coa comunidade e está preparado para discutir ideas sobre como facer que Cinder sexa aínda máis rápido ou como acelerar a transferencia de cambios preparados á parte principal de CPython.

Principais optimizacións implementadas en Cinder:

  • Almacenamento en caché de bytecode ("código de byte sombra"). A esencia do método é identificar situacións nas que se executa un código de operación típico que se pode optimizar e substituír de forma dinámica ese código de operación por opcións especializadas máis rápidas (por exemplo, substituíndo funcións chamadas frecuentemente).
  • Ansiosa avaliación da corrutina. Para as chamadas de función asíncrona que se procesan inmediatamente (wait non dá lugar a unha espera e a función chega antes á instrución de retorno), o resultado destas funcións substitúese directamente sen crear unha rutina nin implicar un bucle de eventos. No código de Facebook que usa moito async/wait, a optimización dá lugar a unha aceleración de aproximadamente un 5%.
  • Recopilación selectiva de JIT a nivel de métodos e funcións individuais (método á vez). Activado mediante a opción "-X jit" ou a variable de ambiente PYTHONJIT=1 e permítelle acelerar a execución de moitas probas de rendemento 1.5-4 veces. Dado que a compilación JIT só é relevante para funcións executadas con frecuencia, non é recomendable usala para funcións de uso pouco frecuente, cuxa sobrecarga de compilación só pode retardar a execución do programa.

    Mediante a opción "-X jit-list-file=/path/to/jitlist.txt" ou a variable de ambiente "PYTHONJITLISTFILE=/path/to/jitlist.txt" pode especificar un ficheiro cunha lista de funcións para as que JIT pódese utilizar (formato de ruta .to.module:funcname ou path.to.module:ClassName.method_name). A lista de funcións para as que se debería activar JIT pódese determinar en función dos resultados do perfil. No futuro, espérase soporte para a compilación dinámica de JIT en función da análise interna da frecuencia das chamadas de funcións, pero tendo en conta os aspectos específicos dos procesos de lanzamento en Instagram, a compilación JIT tamén é adecuada para Facebook na fase inicial.

    JIT converte primeiro o código de bytes de Python nunha representación intermedia de alto nivel (HIR), que está bastante preto do código de bytes de Python, pero está deseñada para usar unha máquina virtual baseada en rexistros en lugar dunha baseada en pila, e tamén usa información de tipo e información adicional. detalles críticos para o rendemento (como o reconto de referencias). Despois, o HIR convértese ao formulario SSA (asignación única estática) e pasa por pasos de optimización que teñen en conta os resultados do reconto de referencia e os datos de consumo de memoria. Como resultado, xérase unha representación intermedia de baixo nivel (LIR), próxima á linguaxe ensambladora. Despois doutra fase de optimizacións baseadas en LIR, xéranse instrucións de montaxe mediante a biblioteca asmjit.

  • Modo estrito para módulos. A funcionalidade inclúe tres compoñentes: Tipo StrictModule. Un analizador estático que pode determinar que a execución dun módulo non ten impacto no código fóra dese módulo. Un cargador de módulos que determina que os módulos están en modo estrito (o código especifica "import __strict__"), comproba a ausencia de interseccións con outros módulos e carga módulos estritos en sys.modules como un obxecto StrictModule.
  • Static Python é un compilador experimental de bytecode que usa anotacións de tipos para xerar bytecode específico de tipo que se executa máis rápido grazas á compilación JIT. Nalgunhas probas, a combinación de Static Python e JIT demostra melloras de rendemento de ata 7 veces en comparación co CPython estándar. En moitas situacións, estímase que os resultados están próximos ao uso dos compiladores MyPyC e Cython.

Fonte: opennet.ru

Engadir un comentario