2009-09-17 16 views
5

Psyco è un compilatore specializzato per Python. The documentation statesPerché Psyco usa molta memoria?

Psyco può e utilizzerà una grande quantità di memoria.

Quali sono i motivi principali di questo utilizzo della memoria? La memoria sostanziale è una caratteristica generale dei compilatori JIT in generale?

Modifica: Grazie per le risposte finora. Ci sono tre probabili contendenti.

  • scrittura più blocchi specializzati, ciascuno dei quali richiedono memoria
  • luminosa a causa di compilazione fonte al volo
  • luminosa a causa di acquisizione dati sufficienti per fare profilazione dinamica

La domanda è, quale è il fattore dominante in nell'utilizzo della memoria? Ho la mia opinione Ma sto aggiungendo una taglia, perché mi piacerebbe accettare la risposta che è effettivamente corretta! Se qualcuno può dimostrare o provare dove viene utilizzata la maggior parte della memoria, lo accetterò. Altrimenti, chiunque vota per la comunità, verrà accettato automaticamente alla fine della ricompensa.

risposta

2

Il sovraccarico di memoria di Psyco è attualmente elevato. Sono stato ridotto un po 'nel tempo, ma è ancora un sovraccarico. Questo overhead è proporzionale alla quantità di codice Python che Psyco riscrive; quindi se la tua applicazione ha alcune funzioni "core" algoritmiche, queste sono quelle che vorrai far accelerare Psyco, non l'intero programma.

Quindi penso che i grandi requisiti di memoria siano dovuti al fatto che carica la fonte in memoria e quindi la compila come va. Più sorgente provi e compili più ne avrà bisogno. Immagino che se si sta tentando di optomise su questo, vedrà più soluzioni possibili per cercare di identificare il caso migliore.

10

Dal sito Web di psyco "La differenza con l'approccio tradizionale ai compilatori JIT è che Psyco scrive diverse versioni degli stessi blocchi (un blocco è un po 'una funzione), che sono ottimizzati essendo specializzati in alcuni tipi di variabili (un "tipo" può significare un tipo, ma è più generale) "

5

" Psyco utilizza i dati di runtime effettivi che il programma manipola per scrivere potenzialmente diverse versioni del codice macchina, ognuna differentemente specializzata per diversi tipi di dati. " http://psyco.sourceforge.net/introduction.html

molti compilatori JIT lavorano con linguaggi staticamente tipizzati, in modo da sapere quali sono i tipi sono così in grado di creare codice macchina solo per i tipi conosciuti. I migliori eseguono il profiling dinamico se i tipi sono polimorfici e ottimizzano i percorsi più comuni; questo è anche comunemente fatto con linguaggi con tipi dinamici e pugnali ;. Psyco sembra sorreggere le sue scommesse al fine di evitare di fare un'analisi completa del programma per decidere quali potrebbero essere i tipi, o profilazione per trovare quali sono i tipi in uso.

e pugnale; Non sono mai andato abbastanza in profondità in Python per capire se ha o non ha tipi dinamici o meno (tipi la cui struttura può essere modificata in runtime dopo che gli oggetti sono stati creati con quel tipo), o solo le implementazioni comuni controllano solo tipi in fase di esecuzione; la maggior parte degli articoli entusiasmano solo sulla digitazione dinamica senza effettivamente definirla nel contesto di Python.

+4

Bel uso di & dagger per implementare un apposito foot note! – unwind

+0

È possibile aggiungere membri e funzioni a un'istanza di una classe al volo. Potresti scaricare, modificare, quindi ricaricare un modulo contenente una classe e iniziare anche a usarne uno nuovo. –

+0

Cambia gli oggetti esistenti con quella classe, o solo quelli nuovi creati dopo la ricarica? –

2

Sicuramente l'utilizzo della memoria psyco proviene da blocchi assemblati compilati. Psyco soffre a volte di overspecialization delle funzioni, il che significa che ci sono più versioni dei blocchi assembler. Inoltre, che è anche molto importante, psyco non libera mai una volta i blocchi assembler assegnati anche se il codice assosciated con esso è morto.

Se si esegue il programma in linux, è possibile guardare/proc/xxx/smaps per vedere un crescente blocco di memoria anonima, che si trova in aree diverse dall'heap. Questa è la parte anonima di mmap per la scrittura di un assemblatore, che ovviamente scompare quando si esegue senza psyco.

Problemi correlati