0
votes

Convertir entier pour flotter

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: xxx

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?


4 commentaires

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 () si nécessaire.


Vous recherchez un bool , 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.


5 Réponses :


1
votes

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


4 commentaires

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 , 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 suffit :)



1
votes

Lorsque les données sont dans la liste, utilisez lambda xxx

sortie xxx

ou utilisez la fonction pour tester la valeur individuelle xxx


1 commentaires

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.



1
votes

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


1 commentaires

Cela convertit Boolean en 1.0!



2
votes

Essayez ceci:

def if_int_to_float(value):

    if type(value) == int:

        return float(value)

    else:

        return value


1 commentaires

Cela fonctionne, merci mais la solution de Fuzzbury est plus rapide!



3
votes

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


3 commentaires

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 est mauvais et vous devez toujours utiliser isinstance 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.