Questa era una domanda piuttosto intrigante. Ho rimosso il if cond: pass
utilizzando v=cond
, ma non ha eliminato completamente la differenza. Non sono ancora certo della risposta, ma ho trovato una ragione plausibile:
switch (op) {
case Py_LT: c = c < 0; break;
case Py_LE: c = c <= 0; break;
case Py_EQ: c = c == 0; break;
case Py_NE: c = c != 0; break;
case Py_GT: c = c > 0; break;
case Py_GE: c = c >= 0; break;
}
Questo è da oggetti/object.c convert_3way_to_object funcion. Si noti che> = è l'ultimo ramo; questo significa che, da solo, non ha bisogno di saltare l'uscita. Questa affermazione di rottura è stata eliminata. Si abbina con lo 0 e lo 5 nello smontaggio di shiki. Essendo un'interruzione incondizionata, può essere gestita dalla previsione del ramo, ma può anche comportare meno codice da caricare.
A questo livello, la differenza sarà naturalmente molto specifica della macchina. Le mie misurazioni non sono molto accurate, ma questo è stato l'unico punto a livello C che ho visto un pregiudizio tra gli operatori. Probabilmente ho avuto un maggiore pregiudizio dal ridimensionamento della velocità della CPU.
fonte
2010-07-30 09:39:06
È necessario tempo> 1000 calcoli e quindi dividere il tempo con la quantità di calcoli per ottenere una lettura accurata. – RvdK
@PoweRoy non è quello che sta facendo con number = 100000? – djna
Devo ammettere che non posso fare Python. Suppongo che chiamare t.timeit esegua l'operazione 'numero' volte (100000). Nvm il commento. – RvdK