Вы можете использовать @propery Python. Он работает как геттер, как и другие языки, такие как C # и JAVA.
В вашем случае вы можете сделать объект, подобный объекту ((i, j), (notEqual(A[i], A[j])))
, с помощью геттера.
См. Пример реализации ниже
class bigListElement(object):
A = [] # this is static
def __init__(self, index_tuple, areEqual):
self.index_tuple = index_tuple
self._areEqual = areEqual
@staticmethod
def notEqual(a, b):
if a is None and b is None:
return True
if a != b:
return True
return False
@property
def areEqual(self):
return bigListElement.notEqual(bigListElement.A[self.index_tuple[0]], bigListElement.A[self.index_tuple[1]])
print("Hello World")
bigListElement.A = [10, 2, 10, 3, 4]
a = bigListElement((0, 1), False)
print(a.areEqual) # True
bigListElement.A[1] = 10
print(a.areEqual) # False
Майк Эш в своем сообщении «Сравнение производительности общих операций» приводит некоторые точные цифры производительности различных вызовов методов Objective-C по сравнению с C и C ++. Также это сообщение by Savoy Software - интересное чтение, когда дело доходит до настройки производительности приложения iPhone с помощью Objective-C ++.
Я предпочитаю чистый, описательный синтаксис Objective-C над Objective-C ++, и не нашел сам язык стал источником моих узких мест в производительности. Я даже склонен делать вещи, которые, как я знаю, приносят в жертву немного производительности, если они делают мой код более удобным в сопровождении.
В этом исследовании говорится, что для того, чтобы действительно получить производительность в игре, интенсивно использующей процессор, вы должны использовать C. Связанная статья содержит проект XCode, который вы можете запустить.
Я считаю, что суть в такова: используйте Objective-C, где вы должны взаимодействовать с функциями iPhone (в конце концов, размещение батутов повсюду не может быть полезным для всех ), но когда дело доходит до циклов, таких вещей, как классы векторных объектов или интенсивный доступ к массивам, придерживайтесь массивов C ++ STL или C, чтобы получить хорошую производительность.
Я имею в виду, было бы совершенно глупо видеть position = [[Vector3 alloc] init] ;
. Вы просто запрашиваете снижение производительности, если используете счетчик ссылок на базовые объекты, такие как вектор позиции.
Очень сложно собрать «достоверные данные», чтобы не вводить в заблуждение.
Самая большая проблема при проведении сравнения функций, как вы предлагаете, заключается в том, что эти два языка поддерживают очень разные стили кодирования. Objective-C - это динамический язык с утиной типизацией, где типичное использование C ++ является статическим. Одна и та же проблема объектно-ориентированной архитектуры, вероятно, будет иметь совершенно разные идеальные решения с использованием C ++ или Objective-C.
Мое мнение (поскольку я много программировал на обоих языках, в основном для больших проектов): чтобы максимизировать производительность Objective-C, он должен быть написан очень близко к C. В то время как с C ++ можно гораздо больше использовать язык без какого-либо ущерба производительности по сравнению с C.
Какой из них лучше? Я не знаю. Для чистой производительности C ++ всегда будет иметь преимущество. Но стиль ООП Objective-C определенно имеет свои достоинства. Я определенно думаю, что с ним легче сохранить разумную архитектуру.
У меня нет жестких данных для объективных C, но у меня есть хорошее место для поиска C ++.
C ++ начался в соответствии с C с классами, в соответствии с Bjarne Strousrup в его отражении в первые годы C ++ ( http://www2.research.att.com/~bs/hopr2.pdf ), так C ++ можно продумать (например, объективную C) как нажатие C до его пределов для объектной ориентации.
Каковы эти ограничения? В период сроки 1994-1997 годов многие исследователи выяснили, что объектно-ориентация пришла по стоимости из-за динамического связывания, например, Когда функции C ++ отмечены виртуальными, и могут быть / могут быть не детские классы, которые переопределяют эти функции. (В Java и C # все функции ожидают, что CTOR по своей природе виртуальны, и там нельзя многое сделать с этим.) В «изучении методов девиртоализации для Java Rest-Time Compiler» от исследователей в IBM Research Tokyo, Они контрастируют методы, используемые для решения этого, включая один из URZ Hölzle и Gerald Aigner. URZ Hölzle, в отдельной статье с Карелом Дриссеном, показал, что в среднем 5,7% времени в программах C ++ (и до ~ 50%) было потрачено на вызов виртуальных функциях (например, VTTable + Thunks). Позже он работал с каким-то MallTalk Resiararchers в том, что в конечном итоге Джава Hotspot VM решает эти проблемы в OO. Некоторые из этих функций придумываются в C ++ (E.g. «Защищенные» и обработка исключений).
Как я уже упоминал, C ++ является статическим набранным, где цель C является набравшей уткой. Разница в производительности в исполнении (но не строк кода), вероятно, является результатом этой разницы.