for - python round up
abs() vs fabs() diferencia de velocidad y ventaja de fabs() (1)
Ejecuté algunas pruebas simples en las funciones abs () y fabs () y no entiendo cuáles son las ventajas de usar fabs (), si es:
1) mas lento
2) trabaja solo en flotadores
3) lanzará una excepción si se usa en un tipo diferente
In [1]: %timeit abs(5)
10000000 loops, best of 3: 86.5 ns per loop
In [3]: %timeit fabs(5)
10000000 loops, best of 3: 115 ns per loop
In [4]: %timeit abs(-5)
10000000 loops, best of 3: 88.3 ns per loop
In [5]: %timeit fabs(-5)
10000000 loops, best of 3: 114 ns per loop
In [6]: %timeit abs(5.0)
10000000 loops, best of 3: 92.5 ns per loop
In [7]: %timeit fabs(5.0)
10000000 loops, best of 3: 93.2 ns per loop
¡Es incluso más lento en flotadores!
Desde donde estoy parado, la única ventaja de usar fabs () es hacer que su código sea más legible, porque al usarlo, está expresando claramente su intención de trabajar con valores de punto flotante / doble
¿Hay algún otro uso de fabs ()?
De una respuesta de correo electrónico de Tim Peters :
¿Por qué las matemáticas tienen una función fabs? Tanto ella como la función incorporada de abs terminan llamando fabs () para flotadores. abs () es más rápido para arrancar.
Nada profundo: el módulo matemático proporciona todo en libm estándar de C89 (+ algunas extensiones), fabs () es una función libm estándar de C89.
No hay una razón clara (para mí) de por qué una sería más rápida que la otra; suena accidental Math.fabs () ciertamente podría hacerse más rápido (como se implementó actualmente (a través de math_1), soporta un montón de propósitos generales "tratar de adivinar si libm debería haber configurado errno" repetitivo) (no hay errores de dominio o rango posibles para fabs ())).
Parece que no hay ninguna razón ventajosa para usar fabs
. Sólo tiene que utilizar abs
para prácticamente todos los propósitos.