Je travaille avec Python et à chaque fois j'ai eu à valider l'entrée de la fonction, je suppose que l'entrée travaillé, et puis attrapé des erreurs.
Dans mon cas, j'ai eu un universel Vector()
classe que j'ai utilisé pour plusieurs choses différentes, dont l'une est plus. Il fonctionne à la fois comme un Color()
classe et en tant que Vector()
, alors quand j'ai ajouter un scalaire à l' Color()
, il faut ajouter que la constante de chaque composant individuel. Vector()
et Vector()
plus composant requis-sage plus.
Ce code est utilisé pour un raytracer de sorte que toute les boosts de vitesse sont grands.
Voici une version simplifiée de mon Vector()
classe:
class Vector:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
def __add__(self, other):
try:
return Vector(self.x + other.x, self.y + other.y, self.z + other.z)
except AttributeError:
return Vector(self.x + other, self.y + other, self.z + other)
Je suis actuellement à l'aide de l' try...except
méthode. Quelqu'un sait d'une méthode plus rapide?
EDIT: Merci pour les réponses, j'ai essayé et testé la solution suivante, qui vérifie en particulier pour un nom de classe avant d'ajouter l' Vector()
objets:
class Vector:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
def __add__(self, other):
if type(self) == type(other):
return Vector(self.x + other.x, self.y + other.y, self.z + other.z)
else:
return Vector(self.x + other, self.y + other, self.z + other)
J'ai couru un test de vitesse avec ces deux blocs de code à l'aide d' timeit
, et les résultats étaient assez importants:
1.0528049469 usec/pass for Try...Except
0.732456922531 usec/pass for If...Else
Ratio (first / second): 1.43736090753
Je n'ai pas testé l' Vector()
classe avec pas de validation de l'entrée que ce soit (c'est à dire le déplacement de la vérification de la classe et dans le code), mais j'imagine que c'est encore plus rapide que l' if...else
méthode.
Fin de mise à jour: en Regardant en arrière à ce code, c'est pas une solution optimale.
OOP cela rend encore plus rapide:
class Vector:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y, self.z + other.z)
class Color(Vector):
def __add__(self, other):
if type(self) == type(other):
return Color(self.x + other.x, self.y + other.y, self.z + other.z)
else:
return Color(self.x + other, self.y + other, self.z + other)