J'essaie d'écrire une fonction qui convertit des nombres entiers à des flotteurs et de laisser des booléens et des cordes comme ils sont.
J'ai défini la fonction suivante: p> Lorsqu'il est utilisé de manière approfondie, j'ai trouvé cette fonction un peu lent. Aucune idée d'améliorer sa performance / la rendre plus pythonique? P> p>
5 Réponses :
Vous pouvez peut-être combiner vos conditions si elles. Cela vous aidera depuis que nous écrivons les conditions de l'IF basées sur les entrées, afin que votre code puisse rendre votre code plus rapide!
a 1.0 1.0 True
Cela fonctionne, merci mais la solution de Fuzzbury est plus rapide!
Bien sûr, puis-je savoir comment vous l'avez jugé plus rapide? Aussi en utilisant le type est mauvais et même les docs suggèrent à utiliser IsInstance
Merci Deveh, il suffit d'exécuter CProfile contre mon code avec la nouvelle fonction. Cependant, après avoir lu plus sur type code>, j'ai choisi votre solution.
Bien sûr, la solution choisie précédente utilisait une multiplication inutile dans le code, alors que juste enchaînant ifinstance code> suffit :)
Lorsque les données sont dans la liste, utilisez sortie p> ou utilisez la fonction pour tester la valeur individuelle p> lambda code>
Merci pour la solution. Mes données ne sont pas dans une liste mais je vais garder cela autour de si j'en ai besoin.
Peut-être que vous pouvez essayer type () code> fonction et obtenir le résultat. Ou vous pouvez utiliser la manipulation des exceptions pour gérer ce type de problème. Mais dans ce cas, comme indiqué dans les commentaires, en cas de
Bool code> valeurs, il a couvert
true code> à
1.0 code> et
false code> à
0,0 code>.
#using type() function
def if_int_to_float(value):
if type(value) == int:
return float(value)
else:
return value
Cela convertit Boolean en 1.0!
Essayez ceci:
def if_int_to_float(value): if type(value) == int: return float(value) else: return value
Cela fonctionne, merci mais la solution de Fuzzbury est plus rapide!
Vous pouvez supprimer un chèque et écrire sur une seule ligne pour obtenir une légère amélioration de la vitesse lorsque vous passez des flotteurs ou des cordes. Le boîtier de Bool est déjà très rapide.
Isinstance () vous cause des problèmes ici, car les bools correspondent également à votre première instruction IF, vous pouvez donc utiliser le type () P>
def if_int_to_float(value): return value * 1.0 if type(value) == int else value
Cela fonctionne comme un charme et rend mon code plus rapide. Merci!
Si je pouvais demander, comment savez-vous @nicolasberthier que c'est plus rapide? En utilisant également type code> est mauvais et vous devez toujours utiliser
isinstance code> pour vérifier les types selon les documents Python: docs.python.org/3/library/fonctions.html#type
Bonjour Devesh, juste en exécutant mon code via CProfile et en remplaçant la fonction.
Que voulez-vous dire quand vous dites lentement?
Question: Pourquoi avez-vous besoin de cette fonction en premier lieu? Cela semble être quelque chose où si vous avez besoin d'un flotteur, vous pouvez simplement lancer vers
float () code> si nécessaire.
Vous recherchez un
bool code>, mais vous ne faites rien de spécial s'il est, afin que vous puissiez supprimer cela.
Ce code est exécuté dans le cadre d'un programme plus vaste et après avoir joué avec CProfile, je vois qu'une bonne partie du temps d'exécution est mangée par cet appel de fonction même si cela n'est pas appelé trop.