Пытаться / поймать или проверить скорость?

Я работаю с 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)

36
задан Nathan Kleyn 13 April 2013 в 20:57
поделиться