bool() y operator.truth() prueban si un valor es verdadero o falso y parecen bastante similares a los documentos, incluso dice en los documentos de truth() que:
Esto es equivalente a usar el constructor bool.
Sin embargo, truth() es más del doble de rápido que bool() a partir de una prueba simple (se muestran los tiempos de Python 3.6, pero 2.7 es similar):
from timeit import timeit print(timeit('bool(1)', number=10000000)) # 2.180289956042543 print(timeit('truth(1)', setup='from operator import truth', number=10000000)) # 0.7202018899843097 entonces cuales son las diferencias? ¿Debo usar truth() en lugar de bool() ?
Esta pregunta y respuesta surgió después de extensos comentarios y discusiones con ShadowRanger sobre esta pregunta .
Aunque bool() y operator.truth() arrojan el mismo resultado para los principales casos de uso, su implementación es bastante diferente. bool() es un constructor de clase o tipo, mientras que truth() es una función regular estrecha y optimizada.
En términos prácticos, también hay dos diferencias: 1) bool() llamado sin argumentos return s False mientras que truth() requiere un argumento. 2) bool() acepta un argumento de palabra clave x , como bool(x=1) , mientras que truth() () no acepta argumentos de palabra clave. Ambos agregan sobrecarga a bool() para los casos de uso regulares.
La palabra clave implementación es extraña ya que es probable que nadie la necesite y el nombre x apenas es descriptivo. El problema 29695 cubre esto y, de hecho, el problema afecta no solo a bool() sino también a otras clases como int() o list() . Sin embargo, a partir de Python 3.7 en adelante, estos argumentos de palabras clave se eliminarán y la velocidad debería mejorar. No obstante, probé los tiempos en la última rama de Python 3.8, y bool() es más rápido que antes, pero sigue siendo el doble de lento que truth() , presumiblemente debido a la implementación más genérica de bool() .
Por lo tanto, si tiene una tarea en la que la velocidad es de gran importancia, recomendaría usar truth() sobre bool() si necesita una función (por ejemplo, para analizar como clave para sorted() ). Sin embargo, como señala khelwood , bool() aún puede ser más rápido ocasionalmente, como filter(bool, iterable) , por lo que probablemente sea mejor programar su caso de uso para estar seguro de cuál es la mejor opción.
Por supuesto, si no necesita una función y simplemente quiere probar si un valor es verdadero o falso , debe usar las declaraciones idiomáticas if o if not , que son las más rápidas como comentaron khelwood y user2357112 .
Esta pregunta y respuesta surgió después de extensos comentarios y discusiones con ShadowRanger sobre esta pregunta .