Esta fue una pregunta bastante intrigante. Eliminé el if cond: pass
usando v=cond
, pero no eliminó por completo la diferencia. Todavía no estoy seguro de la respuesta, pero he encontrado una razón plausible:
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;
}
Esto es de Objetos/convert_3way_to_object funcion object.c. Tenga en cuenta que> = es la última rama; eso significa que, solo, no necesita saltar de salida. Esa declaración de interrupción se elimina. Coincide con el 0 y 5 en el desmontaje de shiki. Al tratarse de una ruptura incondicional, puede ser manejada por la predicción de bifurcación, pero también puede dar lugar a que se cargue menos código.
En este nivel, la diferencia será, naturalmente, altamente específica de la máquina. Mis medidas no son muy minuciosas, pero este fue el único punto en el nivel C. Vi un sesgo entre los operadores. Probablemente recibí un mayor sesgo de la escala de velocidad de la CPU.
Debe medir> 1000 cálculos y luego dedique su tiempo con la cantidad de cálculos para obtener una lectura precisa. – RvdK
@PoweRoy ¿no es eso lo que está haciendo con number = 100000? – djna
Tengo que admitir que no puedo hacer Python. Supongo que llamar a t.timeit hace los tiempos de 'número' de ejecución (100000). Nvm el comentario. – RvdK