1 Создайте свою собственную функцию разделения
Этот шаг действительно прост, если вы посмотрите на реализацию и спросите себя: «Как я могу сделать это быстрее»
def separation(self, other):
from . import Angle
from .angle_utilities import angular_separation # I've put that in the code bellow so it is clearer
if not self.is_equivalent_frame(other):
try:
other = other.transform_to(self, merge_attributes=False)
except TypeError:
raise TypeError('Can only get separation to another SkyCoord '
'or a coordinate frame with data')
lon1 = self.spherical.lon
lat1 = self.spherical.lat
lon2 = other.spherical.lon
lat2 = other.spherical.lat
sdlon = np.sin(lon2 - lon1)
cdlon = np.cos(lon2 - lon1)
slat1 = np.sin(lat1)
slat2 = np.sin(lat2)
clat1 = np.cos(lat1)
clat2 = np.cos(lat2)
num1 = clat2 * sdlon
num2 = clat1 * slat2 - slat1 * clat2 * cdlon
denominator = slat1 * slat2 + clat1 * clat2 * cdlon
return Angle(np.arctan2(np.hypot(num1, num2), denominator), unit=u.degree)
Он вычисляетмного косинусов и синусов, затем создает экземпляр Angle
и конвертирует в градусы, затем вы конвертируете в угловые секунды.
Возможно, вы не захотите использовать Angle, а также тесты и преобразования в начале, а такжеделать импорт в функции, и не делать так много назначения переменных, если вам нужна производительность.
Функция разделения кажется мне немного тяжелой, она должна просто брать числа и возвращать число.
2 Использовать дерево квадратов (требуется полная перезапись вашего кода)
Тем не менее, давайте посмотрим на сложность вашего алгоритма, он сравнивает каждый элемент с каждым другим элементом, сложность равна O(n**2)
(нотация Big O).Можем ли мы сделать лучше ...
ДА Вы можете использовать Quad-дерево, в наихудшем случае сложность Quad-дерева равна O (N).В основном это означает, что если вы не знакомы с Big O, это то, что для элемента 15 000
поиск будет в 1021 * раз больше, чем для элемента 1
вместо 225 000 000
раз (15 000
в квадрате).... довольно хорошее улучшение ... У Сципи есть отличная библиотека Quad Tree (я всегда использовал свою).