Python 搜索并添加到随每次循环而增长的大型列表的最有效方法

Python 搜索并添加到随每次循环而增长的大型列表的最有效方法,python,performance,Python,Performance,简而言之,我在列表(所有点的列表)中有一个列表(坐标)(与点相关的其他信息)。它需要能够处理数以万计的值,并且显然会以指数方式减速,因此理想情况下,最有效的解决方案将是有用的 每次代码运行时,它都会向列表中添加一个新项目,因此排序不是一个选项。 我见过有人建议集合,但在列表不断增长且我需要的值在主值内的情况下,这会起作用吗?或者,我可以考虑使用一个单独的集合来存储坐标作为一个集合,但是增加的内存需求是否值得额外的速度 我目前的做法与此类似: growingList = [ [[1,0,0],0,

简而言之,我在列表(所有点的列表)中有一个列表(坐标)(与点相关的其他信息)。它需要能够处理数以万计的值,并且显然会以指数方式减速,因此理想情况下,最有效的解决方案将是有用的

每次代码运行时,它都会向列表中添加一个新项目,因此排序不是一个选项。
我见过有人建议集合,但在列表不断增长且我需要的值在主值内的情况下,这会起作用吗?或者,我可以考虑使用一个单独的集合来存储坐标作为一个集合,但是增加的内存需求是否值得额外的速度

我目前的做法与此类似:

growingList = [ [[1,0,0],0,0], [[1,1,0],1,0] ]
itemToAdd = [5,7,3]

itemExists = False
for i in range( len(growingList) ):
    if itemToAdd == growingList[i][0]:
        itemExists = True
        break
if itemExists == False:
    growingList.append( [itemToAdd, otherValue, otherValue2] )

您有一组唯一的项目和关联的数据。您要查找的数据结构是字典。下面是与使用字典的示例等效的代码:

data = { (1, 0, 0): [0, 0], (1, 1, 0): [1, 0] }
keytoadd = (5, 7, 3)
valuetoadd = [othervalue, othervalue2]

if keytoadd not in data:
    data[keytoadd] = valuetoadd

它绝对不会像你担心的那样以指数级的速度减慢。平均案例插入时间为常数时间(O(1))。如果您需要一个列表,那么当您需要它时,您可以从字典中轻松获得它:
data.items()。如果你想要更多的速度,考虑使用更多的空间。在这种情况下,一个单独的集合会是最好的选择吗?如果一个单独的集合解决了你的问题,然后你对速度/内存性能感到满意,那么我会说这是一个很好的解决方案。好的,谢谢,我会给你一个答案:一个可能的答案:使用一套快速查找。不过,您需要将元素更改为元组——set元素需要是不可变的。另外,
growingList
的格式也错误。它产生了一个语法错误。啊,非常感谢,我会试试这个,我不知道字典的大小没有变慢,这种方法会比单独存储一组坐标好吗?dict和set的性能基本相同。但对于集合,您只有键,不能关联值。由于有与键(坐标)关联的值,字典是自然的数据结构。所以你肯定想要这本字典。