Pregunta

En mi trabajo actual me escribo algunos de larga duración (creo horas al día) scripts que hacen uso intensivo de CPU de procesamiento de datos. El flujo del programa es muy simple - se procede en el bucle principal, completa el bucle principal, ahorra salida y termina: La estructura básica de mis programas tiende a ser de esta manera:

<import statements>
<constant declarations>

<misc function declarations>

def main():
   for blah in blahs():
      <lots of local variables>
      <lots of tightly coupled computation>

      for something in somethings():
          <lots more local variables>
          <lots more computation>

   <etc., etc.>

   <save results>

if __name__ == "__main__":
    main()

Esto se pone inmanejable rápidamente, así que quiero refactorearlo en algo más manejable. Quiero que esto sea más fácil de mantener, sin sacrificar la velocidad de ejecución.

Cada tirada de código se basa en un gran número de variables sin embargo, por lo refactorización partes del cómputo a cabo funciones haría que la lista de parámetros de crecimiento de las manos muy rápidamente. ¿Debo poner este tipo de código en una clase de Python, y cambiar las variables locales en las variables de clase? No tiene una gran dosis de sentido tp me conceptualmente convertir el programa en una clase, como la clase nunca se puede volver a utilizar, y sólo una instancia se hubiera creado por instancia.

¿Cuál es la mejor estructura de la práctica de este tipo de programa? Estoy usando Python, pero la cuestión es relativamente independiente del idioma, asumiendo unas modernas características del lenguaje orientado a objetos.

¿Fue útil?

Solución

En primer lugar, si el programa va a ser candidato a las horas / días, entonces la sobrecarga de conmutación a la utilización de clases / métodos en lugar de poner todo en un gigante principal es prácticamente inexistente.

Además, la refactorización (incluso si implica pasar una gran cantidad de variables) deberían ayudar a mejorar la velocidad en el largo plazo. Perfil de una aplicación que está diseñado así es mucho más fácil porque se puede precisar la partes lentas y optimizar allí. Tal vez una nueva biblioteca viene que es altamente optimizados para sus cálculos ... un programa bien diseñado le permitirá conectarla y prueba de inmediato. O tal vez usted decide escribir una extensión C Módulo para mejorar la velocidad de un subconjunto de sus cálculos, una aplicación bien diseñada hará que también muy fácil.

Es difícil dar consejos concretos sin ver <lots of tightly coupled computation> y <lots more computation>. Sin embargo, me gustaría empezar con la fabricación de cada bloque for su propio método y seguir desde ahí.

Otros consejos

No muy limpio, pero funciona bien en pequeños proyectos ...

Se puede empezar a utilizar módulos como si fueran casos simples, y crear clases reales sólo cuando se sienta la complejidad del módulo o los justifica cálculo ellos.

Si lo hace, usted quiere utilizar "módulo de importación" y no "de la materia importación de módulo" - es más limpio y funcionará mejor si "cosas" puede ser reasignado. Además, se recomienda en las directrices de Google.

El uso de una clase (o clases) pueden ayudarle a organizar su código. La simplicidad de la forma (por ejemplo, mediante el uso de atributos de clase y métodos) es importante porque ayuda a que vea a su algoritmo, y que puede ayudar más fácilmente a prueba de unidad de las partes.

OMI, estos beneficios son muy superiores a la ligera pérdida de velocidad que puede venir con el uso de programación orientada a objetos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top