Domanda

Per il mio attuale lavoro vi scrivo alcuni di lunga durata (si pensi ore a giorni) script che fanno la CPU di elaborazione dati. Il flusso del programma è molto semplice - procede nel circuito principale, completa il ciclo principale, salva uscita e termina: la struttura di base dei miei programmi tende ad essere in questo modo:

<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()

Questo diventa ingestibile in fretta, quindi voglio refactoring in qualcosa di più gestibile. Voglio fare questo più gestibile, senza sacrificare la velocità di esecuzione.

Ogni mandrino di codice si basa su un gran numero di variabili tuttavia, in modo refactoring parti del calcolo fuori per funzioni renderebbe lista parametri crescere di mano molto rapidamente. Devo mettere questo tipo di codice in una classe di pitone, e modificare le variabili locali in variabili di classe? Non ha una grande quantità di senso tp mi concettualmente a girare il programma in una classe, come la classe non sarebbe mai essere riutilizzato, e una sola istanza avrebbe mai essere creato per ogni istanza.

Qual è la migliore struttura di prassi per questo tipo di programma? Sto usando Python, ma la questione è relativamente indipendente dal linguaggio, assumendo una moderna funzionalità linguaggio orientato agli oggetti.

È stato utile?

Soluzione

Prima di tutto, se il programma sta per essere in esecuzione per ore / giorni quindi il sovraccarico di passaggio a utilizzando le classi / metodi invece di mettere tutto in un gigante principale è praticamente inesistente.

Inoltre, il refactoring (anche se non comporta il superamento di un sacco di variabili) dovrebbe aiutare a migliorare la velocità nel lungo periodo. Profiling un'applicazione che è stato progettato bene è molto più facile perché si può pin-point le parti lente e ottimizzare lì. Forse una nuova libreria arriva che è altamente ottimizzato per i calcoli ... un programma ben progettato vi permetterà di collegarla e prova subito. O forse si decide di scrivere un estensione C Modulo per migliorare la velocità di un sottoinsieme di calcoli, un'applicazione ben progettata renderà facile anche.

E 'difficile dare consigli concreti senza vedere <lots of tightly coupled computation> e <lots more computation>. Ma, vorrei iniziare con fare ogni blocco for è proprio metodo e passare da lì.

Altri suggerimenti

Non troppo pulita, ma funziona bene in piccoli progetti di ...

È possibile iniziare a utilizzare i moduli come se fossero casi Singleton, e creare le classi reali solo quando si sente la complessità del modulo o il calcolo giustifica loro.

Se lo fai, si vorrebbe usare "modulo di importazione" e non "da roba modulo di importazione" - è più pulito e funzionerà meglio se "roba" può essere riassegnata. Inoltre, è raccomandato nelle linee guida di Google.

Utilizzo di una classe (o le classi) può aiutare a organizzare il vostro codice. La semplicità della forma (ad esempio attraverso l'uso di attributi di classe e metodi) è importante perché aiuta a vedere l'algoritmo, e può aiutare a più facilmente unit test le parti.

IMO, questi benefici superano di gran lunga la leggera perdita di velocità che possono venire con l'utilizzo di programmazione orientata agli oggetti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top