У меня проблемы с производительностью при добавлении в Python.Я пишу алгоритм, который проверяет, есть ли два перекрывающихся круга в (большом) наборе кругов.Я начинаю с помещения крайних точек окружностей (x_i-R_i & x_i + R_i) в список, а затем сортирую список.
class Circle:
def __init__(self, middle, radius):
self.m = middle
self.r = radius
Между ними я генерирую N случайных окружностей и помещаю их в 'список кругов.
"""
Makes a list with all the extreme points of the circles.
Format = [Extreme, left/right ~ 0/1 extreme, index]
Seperate function for performance reason, python handles local variables faster.
Garbage collect is temporarily disabled since a bug in Python makes list.append run in O(n) time instead of O(1)
"""
def makeList():
"""gc.disable()"""
list = []
append = list.append
for circle in circles:
append([circle.m[0]-circle.r, 0, circles.index(circle)])
append([circle.m[0] + circle.r, 1, circles.index(circle)])
"""gc.enable()"""
return list
При выполнении этого с кругами по 50 КБ создание списка занимает более 75 секунд.Как вы могли заметить в комментариях, которые я написал, я отключил сборщик мусора, поместил его в отдельную функцию, использовал
append = list.append
append(foo)
вместо просто
list.append(foo)
Я отключил gc, так как после некоторого поискапохоже, что в Python есть ошибка, приводящая к тому, что append запускается в O (n) вместо O (c) времени.
Так что это самый быстрый способ или есть способ сделать это быстрее?Любая помощь с благодарностью.