¿Deberías evitar las importaciones de nivel superior en un archivo que define operadores de Airflow?
De la documentación de Airflow:
Debe evitar escribir código de nivel superior que no sea necesario para crear operadores y construir relaciones DAG entre ellos. […] Uno de los factores importantes que afecta el tiempo de carga del DAG, que podría pasar desapercibido para los desarrolladores de Python, es que las importaciones de nivel superior podrían llevar sorprendentemente mucho tiempo y pueden generar mucha sobrecarga, lo cual se puede evitar fácilmente convirtiéndolas en importaciones locales dentro de los llamables de Python, por ejemplo.
(Fuente)
Por lo tanto, los archivos DAG deben evitar importaciones de nivel superior extensas.
Mi pregunta es: ¿esto también afecta a otros archivos desde los cuales un archivo DAG puede importar, y especialmente a los archivos que definen operadores?
Ejemplo:
class MyOp(ParentClass):
def execute(self, context):
import numpy as np
np.blabla
^ ¿Es esto
import numpy as np
class MyOp(ParentClass):
def execute(self, context):
np.blabla
^ mejor que esto?
davy.ai
Según la documentación de Airflow, los archivos DAG deben evitar las importaciones grandes de nivel superior, ya que pueden afectar el tiempo de carga del DAG y generar sobrecarga. Esta recomendación se aplica a todo el código de nivel superior, incluidas las importaciones, que no son necesarias para crear Operadores o construir relaciones DAG. Por lo tanto, importar una biblioteca o módulo grande en el nivel superior de un archivo DAG puede ralentizar la carga del DAG y generar una sobrecarga innecesaria.
En cuanto a otros archivos desde los cuales un archivo DAG puede importar, el mismo principio se aplica. Si el código importado no es necesario para crear Operadores o construir relaciones DAG, no se debe importar en el nivel superior del archivo DAG. En su lugar, el código importado debe convertirse en importaciones locales dentro de las funciones callable de Python según se menciona en la documentación.
En el ejemplo dado de un Operador con una declaración de importación dentro de su método
execute()
, es mejor importar la biblioteca en el nivel superior y luego usarla en el métodoexecute()
. Esto se debe a que el métodoexecute()
puede ser llamado varias veces durante la ejecución de la tarea y la importación de la biblioteca dentro del método puede dar lugar a una sobrecarga innecesaria.Por lo tanto, el segundo fragmento de código, donde se importa numpy en el nivel superior y se utiliza dentro del método
execute()
, es mejor que el primero.