我在Python中使用'append'时遇到了一些性能问题。 我正在编写一个算法,用于检查一个(大)圆集合中是否存在两个重叠的圆。 我首先将圆的极点(x_i-R_i和x_i+R_i)放入列表中,然后对列表进行排序。
class Circle:
def __init__(self, middle, radius):
self.m = middle
self.r = radius
在此期间,我生成了N个随机圆并将它们放入“circles”列表中。
"""
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
当使用50k个圆运行此代码时,需要超过75秒才能生成列表。正如您在我写的评论中所看到的那样,我禁用了垃圾收集器,将其放在一个单独的函数中,使用了...
append = list.append
append(foo)
不仅仅是
list.append(foo)
我禁用了垃圾收集器,因为经过一些搜索发现 Python 存在一个 bug,导致 append 方法的运行时间变成 O(n) 而不是 O(c)。
那么这种方式是最快的方式吗?还是有其他方法可以使其运行更快呢?任何帮助都将不胜感激。
list
不是一个好的变量名。 - eumiro#注释
。文档字符串必须放在函数内部,而不是函数前面。 - Sven Marnach