Я работаю с 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
.Кто-нибудь знает более быстрый метод?
РЕДАКТИРОВАТЬ: Благодаря ответам, я попробовал и протестировал следующее решение, которое проверяет специально для имени класса перед добавлением Vector()
objects:
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
метод.
Позднее обновление : оглядываясь назад на этот код, это не оптимальное решение.
ООПделает это еще быстрее:
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)