Я работаю с Python, и всякий раз, когда мне приходилось проверять ввод функции, я предполагал, что вход работал, а затем поймал ошибки.
В моем случае у меня был универсальный класс Vector()
, который я использовал для нескольких разных вещей, одним из которых является добавление. Он функционировал как как Color()
, так и как Vector()
, поэтому, когда я добавляю скаляр в Color()
, он должен добавлять эту константу к каждому отдельному компоненту. Vector()
и Vector()
добавление дополнительного компонента.
Этот код используется для raytracer, поэтому любые ускорения скорости великолепны.
Вот упрощенная версия моего класса 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()
без проверки ввода (т.е. перемещая проверку класса и в фактический код), но я бы предположил, что он даже быстрее, чем метод if...else
.
Позднее обновление. Оглядываясь назад на этот код, это не оптимальное решение.
OOP делает это еще быстрее:
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)