Stavo confrontando un vecchio script PHP contro il più recente, più follemente la versione Django e quella PHP, con sputi completi di HTML e tutto funzionava più velocemente. MOLTO più veloce al punto che qualcosa deve essere sbagliato su quello Django.Django (?) Molto lento con set di dati di grandi dimensioni dopo aver eseguito alcuni profili Python
In primo luogo, un contesto: ho una pagina che sputa i rapporti dei dati di vendita. I dati possono essere filtrati da un certo numero di cose ma sono per lo più filtrati per data. Ciò rende un po 'difficile metterlo nella cache poiché le possibilità di risultati sono quasi infinite. Ci sono un sacco di numeri e calcoli fatti ma non è mai stato un gran problema da gestire in PHP.
AGGIORNAMENTI:
Dopo alcuni test supplementari non c'è nulla nel mio punto di vista che sta causando il rallentamento. Se mi limito a digitare i dati e sputare 5 righe di HTML reso, non è così lento (ancora più lento di PHP), ma se sto facendo un sacco di dati, è MOLTO lento.
Ogni volta che ho eseguito un rapporto di grandi dimensioni (ad esempio tutte le vendite dell'anno), l'utilizzo della CPU della macchina è pari al 100%. Non so se questo significa molto. Sto usando mod_python e Apache. Forse passare a WSGI può aiutare?
I miei tag modello che mostrano i totali parziali/totali vanno da 0,1 secondi a 1 secondo per set molto grandi. Li chiamo circa 6 volte all'interno del report in modo che non sembri il problema più grande.
Ora, ho eseguito un profiler Python e tornato con questi risultati:
Ordered by: internal time List reduced from 3074 to 20 due to restriction ncalls tottime percall cumtime percall filename:lineno(function) 2939417 26.290 0.000 44.857 0.000 /usr/lib/python2.5/tokenize.py:212(generate_tokens) 2822655 17.049 0.000 17.049 0.000 {built-in method match} 1689928 15.418 0.000 23.297 0.000 /usr/lib/python2.5/decimal.py:515(__new__) 12289605 11.464 0.000 11.464 0.000 {isinstance} 882618 9.614 0.000 25.518 0.000 /usr/lib/python2.5/decimal.py:1447(_fix) 17393 8.742 0.001 60.798 0.003 /usr/lib/python2.5/tokenize.py:158(tokenize_loop) 11 7.886 0.717 7.886 0.717 {method 'accept' of '_socket.socket' objects} 365577 7.854 0.000 30.233 0.000 /usr/lib/python2.5/decimal.py:954(__add__) 2922024 7.199 0.000 7.199 0.000 /usr/lib/python2.5/inspect.py:571(tokeneater) 438750 5.868 0.000 31.033 0.000 /usr/lib/python2.5/decimal.py:1064(__mul__) 60799 5.666 0.000 9.377 0.000 /usr/lib/python2.5/site-packages/django/db/models/base.py:241(__init__) 17393 4.734 0.000 4.734 0.000 {method 'query' of '_mysql.connection' objects} 1124348 4.631 0.000 8.469 0.000 /usr/lib/python2.5/site-packages/django/utils/encoding.py:44(force_unicode) 219076 4.139 0.000 156.618 0.001 /usr/lib/python2.5/site-packages/django/template/__init__.py:700(_resolve_lookup) 1074478 3.690 0.000 11.096 0.000 /usr/lib/python2.5/decimal.py:5065(_convert_other) 2973281 3.424 0.000 3.424 0.000 /usr/lib/python2.5/decimal.py:718(__nonzero__) 759014 2.962 0.000 3.371 0.000 /usr/lib/python2.5/decimal.py:4675(__init__) 381756 2.806 0.000 128.447 0.000 /usr/lib/python2.5/site-packages/django/db/models/fields/related.py:231(__get__) 842130 2.764 0.000 3.557 0.000 /usr/lib/python2.5/decimal.py:3339(_dec_from_triple)
tokenize.py esce in cima, che possono rendere un certo senso come sto facendo un sacco di formattazione dei numeri . Decimal.py ha senso poiché il report è essenzialmente al 90%. Non ho idea di cosa sia il metodo integrato match
come non sto facendo alcun Regex o simile nel mio stesso codice (Qualcosa che Django sta facendo?) La cosa più vicina è che sto usando itertools ifilter.
Sembra che questi siano i principali colpevoli e se potessi capire come ridurre i tempi di elaborazione di quelli allora avrei una pagina molto più veloce.
Qualcuno ha qualche suggerimento su come potrei iniziare a ridurlo? Non so davvero come risolverei i problemi tokenize/decimal senza semplicemente rimuoverli.
Aggiornamento: ho eseguito alcuni test con/senza filtri sulla maggior parte dei dati e i tempi dei risultati sono tornati praticamente uguali, essendo quest'ultimo un po 'più veloce ma non molto per essere la causa del problema. Cosa sta succedendo esattamente in tokenize.py?
È impossibile suggerire qualcosa di utile senza il codice di visualizzazione e la guida per la creazione di profili. –
Alex: La mia opinione è abbastanza semplice. Apre un elenco iniziale di voci, quindi se il report viene modificato aggiunge alcuni filtri. Questo è davvero. Il mio modello quindi raggruppa il set di dati in due sezioni e quindi esegue il ciclo di tutto, chiamando templatetags lungo la strada (ma ho programmato i tag del template da eseguire in 0.1 -> 0.5 secondi .. questi templatetags sono i subtotali/totali del report in modo che il tempo di esecuzione sia corretto su enormi serie di dati.) – Bartek
@Bartek: per favore non commentare la tua stessa domanda. È la tua domanda, puoi aggiornarla per contenere tutti i fatti rilevanti. –