Я работаю с Python, и всякий раз, когда мне приходилось проверять ввод функции, я предполагал, что ввод работает, а затем обнаружил ошибки.
В моем случае у меня был универсальный класс Vector ()
, который я использовал для нескольких разных вещей, одна из которых - сложение. Он функционировал как класс Color ()
и как Vector ()
, поэтому, когда я добавляю скаляр к Color ()
, он должен добавить, что константа для каждого отдельного компонента. Добавление Vector ()
и Vector ()
требует покомпонентного добавления.
Этот код используется для трассировщика лучей, поэтому любое увеличение скорости отлично.
Вот упрощенный версия моего класса Vector ()
:
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)
В настоящее время я использую метод try ... except
. Кто-нибудь знает о более быстром методе?
EDIT: Благодаря ответам я попробовал и протестировал следующее решение, которое специально проверяет имя класса перед добавлением объектов Vector ()
:
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)
Я провел тест скорости с этими двумя блоками кода, используя timeit
, и результаты были довольно значительными:
1.0528049469 usec/pass for Try...Except
0.732456922531 usec/pass for If...Else
Ratio (first / second): 1.43736090753
Я не тестировал класс Vector ()
с без какой-либо проверки ввода (т. е. перенос проверки из класса в фактическую code), но я бы предположил, что он даже быстрее, чем метод if ... else
.
Позднее обновление : оглядываясь на этот код, это , а не оптимальное решение.
ООП делает это еще быстрее:
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)