Sqlite3 lento su query standard, è previsto? [chiuso]

-1

Uso di Python e sqlite3. Questo semplice ciclo di stampa richiede alcuni secondi per essere eseguito. Non ne so molto dei database, quindi suppongo che non sto usando queste query correttamente. Sicuramente sqlite dovrebbe essere più veloce? L'intero db ha 5k o più righe e solo poche colonne se questo è importante.

con = lite.connect('gamelist.db')
with con:
    cur = con.cursor()
    cur.execute("SELECT * FROM GameList WHERE processed IS NULL LIMIT 4")
    for i in range(0, 4):
        print cur.fetchone()
    
posta Benjamin Lindqvist 04.05.2014 - 20:23
fonte

1 risposta

5

Non indovinare, misura

Quando hai un problema relativo alle prestazioni, non indovinare. Prendi un profiler, misura il tuo codice e decidi cosa ottimizzare in base ai risultati, non alle tue ipotesi o a qualcun altro.

La prima ipotesi è che sqlite3 sia lento. La tua seconda ipotesi è che hai perdite di memoria. È possibile che, quando si analizza la tua app, scoprirai che nessuna delle due ipotesi è vicina al problema reale. Succede a tutti gli sviluppatori; ecco perché non si dovrebbe indovinare.

La documentazione di Python elenca alcuni profiler per Python. Se non ne hai mai usato uno, prendi un profiler a tua scelta e vedi dove potrebbe farti arrivare. Punti bonus per il ritorno e la pubblicazione dei risultati modificando la domanda.

Sii preciso

Inoltre, quando si tratta di prestazioni, sii il più preciso possibile. Termini come "Qualche secondo", "lento", "query standard" non hanno nulla a che fare quando si tratta di prestazioni, profilazione e ottimizzazione.

  • Non esiste una cosa come pochi secondi. C'è un dato statistico sulle prestazioni di un dato pezzo di codice eseguito in un contesto molto specifico. Qualcosa che richiede cinque secondi su un Pentium IV che abbiamo buttato via ieri potrebbe essere eseguito in pochi millisecondi sul nuovo server che abbiamo appena acquistato.

  • Non esiste una cosa come il codice troppo lento: c'è un pezzo di codice che esegue in media 327 ms. su un dato hardware sotto stress dato, mentre un requisito non funzionale (vedere anche questa risposta , punti 2 e 8 ) specifica che dovrebbe eseguire meno di 300 ms. nel 95% dei casi.

  • Non esiste una query standard. Per qualcuno, una query standard può includere join. Per un'altra persona, è un select , insert , update o delete con nient'altro come where .

Hai specificato il numero di righe nel database. Questa è la precisione di cui sto parlando. Misurare un select su dieci righe non equivale a un miliardo di righe.

Riduci il codice misurato al minimo

Quando non puoi usare un vero profiler, può aiutarti a rimuovere tutto il codice che non ti serve e poi misurare. Nel tuo caso particolare, ciò comporta la conversione di una matrice in una stringa e la visualizzazione di questa stringa in una console.

Prova a misurare effettivamente le prestazioni dello stesso codice senza stampare quei risultati e vedere come influisce.

    
risposta data 04.05.2014 - 22:11
fonte

Leggi altre domande sui tag