libreria - pow python
Exponenciación en Python: ¿debería preferir** operator en lugar de math.pow y math.sqrt? (2)
Incluso en Python base puede hacer el cálculo en forma genérica
result = sum(x**2 for x in some_vector) ** 0.5
x ** 2
seguramente no es un truco y el cálculo realizado es el mismo (lo comprobé con el código fuente de cpython). De hecho, lo encuentro más legible (y la legibilidad cuenta).
Usar en su lugar x ** 0.5
para tomar la raíz cuadrada no hace exactamente los mismos cálculos que math.sqrt
ya que el primero (probablemente) se calcula usando logaritmos y el último (probablemente) usando la instrucción numérica específica del procesador matemático.
A menudo uso x ** 0.5
simplemente porque no quiero agregar math
solo para eso. Sin embargo, esperaría una instrucción específica para que la raíz cuadrada funcione mejor (con mayor precisión) que una operación de varios pasos con logaritmos.
Esta pregunta ya tiene una respuesta aquí:
- ¿Qué es más rápido en Python: x **. 5 o math.sqrt (x)? 13 respuestas
En mi campo, es muy común cuadrar algunos números, operarlos juntos y tomar la raíz cuadrada del resultado. Esto se hace en el teorema de Pitágoras, y el cálculo de RMS, por ejemplo.
En numpy, he hecho lo siguiente:
result = numpy.sqrt(numpy.sum(numpy.pow(some_vector, 2)))
Y en python puro algo como esto sería esperado:
result = math.sqrt(math.pow(A, 2) + math.pow(B,2)) # example with two dimensions.
Sin embargo, he estado usando esta forma pura de python, ya que la considero mucho más compacta, independiente de la importación y aparentemente equivalente:
result = (A**2 + B**2)**0.5 # two dimensions
result = (A**2 + B**2 + C**2 + D**2)**0.5
He escuchado que algunas personas argumentan que el operador **
es una especie de hack, y que cuadrar un número exponiéndola por 0.5
no es tan legible. Pero lo que me gustaría preguntar es si:
"¿Hay alguna razón COMPUTACIONAL para preferir las dos alternativas anteriores a la tercera (s)?"
¡Gracias por leer!
math.sqrt
es la implementación C de la raíz cuadrada y, por lo tanto, es diferente de usar el operador **
que implementa la función pow
incorporada de Python. Por lo tanto, usar math.sqrt
realidad da una respuesta diferente que usar el operador **
y de hecho existe una razón computacional para preferir la implementación del módulo numpy
o math
sobre el built-in. Específicamente, las funciones sqrt probablemente se implementen de la manera más eficiente posible, mientras que **
opera en un gran número de bases y exponentes y probablemente no esté optimizado para el caso específico de la raíz cuadrada. Por otro lado, la función pow
incorporada maneja algunos casos adicionales como "números complejos, potencias enteras ilimitadas y exponenciación modular".
En términos de cuál es más "Pythonic", pienso que necesitamos discutir la misma definición de esa palabra. Del glosario oficial de Python , se establece que una pieza de código o idea es Pythonic si "sigue de cerca los modismos más comunes del lenguaje Python, en lugar de implementar código usando conceptos comunes a otros idiomas". En cada uno de los otros idiomas en los que puedo pensar, hay algún módulo matemático con funciones básicas de raíz cuadrada. Sin embargo, hay idiomas que carecen de un operador de energía como **
por ejemplo, C ++. Así que **
es probablemente más Pythonic, pero si objetivamente es mejor o no depende del caso de uso.