我不断创建一个基于500列的随机生成的大小为10的New_X
列表。
每次创建新列表时,它都必须是唯一的,并且我的函数NewList
只有在尚未创建并附加到New_X
后才会返回List_Of_Xs
def NewList(Old_List):
end = True
while end == True:
""" Here is code that generates my new sorted list, it is a combination of elements
from Old_List and the other remaining columns,
but the details aren't necessary for this question. """
end = (List_Of_Xs == np.array([New_X])).all(axis=1).any()
List_Of_Xs.append(New_X)
return New_X
我的问题是,end = (List_Of_Xs == np.array([New_X])).all(axis=1).any()
行是查看List_Of_Xs
的有效方式吗?
我的List_Of_Xs
可以长到超过100,000个列表,所以我不确定这是否效率低。
任何帮助将不胜感激!
答案 0 :(得分:1)
所以让我直截了当,因为代码看起来并不完整: 1.您有一个旧列表,每次迭代都会不断增长 你计算一个清单 3.将它与旧列表中的每个列表进行比较,看看是否应该打破循环?
一种选择是将列表存储在一个集合而不是列表列表中。 将元素与列表的所有元素进行比较将是每次迭代的O(n)操作。使用一个集合它应该是O(1)avg ...虽然你可能每次迭代都得到O(n)直到最后一次。
其他想法是计算每个元素的md5并进行比较,以便您不比较完整列表。
答案 1 :(得分:1)
正如我在评论中观察到的那样,数组比较可能非常慢,尤其是当列表变大时。它必须每次都创建数组,这会消耗时间。
这是一个集合实现
创建10个元素列表的功能:
def foo(N=10):
return np.random.randint(0,10,N).tolist()
生成列表并打印唯一列表的功能
def foo1(m=10):
Set_of_Xs = set()
while len(Set_of_Xs)<m:
NewX = foo(10)
tx = tuple(NewX)
if not tx in Set_of_Xs:
print(NewX)
Set_of_Xs.add(tx)
return Set_of_Xs
示例运行。如上所述,它没有显示是否有重复。
In [214]: foo1(5)
[9, 4, 3, 0, 9, 4, 9, 5, 6, 3]
[1, 8, 0, 3, 0, 0, 4, 0, 0, 5]
[6, 7, 2, 0, 6, 9, 0, 7, 0, 8]
[9, 5, 6, 3, 3, 5, 6, 9, 6, 9]
[9, 2, 6, 0, 2, 7, 2, 0, 0, 4]
Out[214]:
{(1, 8, 0, 3, 0, 0, 4, 0, 0, 5),
(6, 7, 2, 0, 6, 9, 0, 7, 0, 8),
(9, 2, 6, 0, 2, 7, 2, 0, 0, 4),
(9, 4, 3, 0, 9, 4, 9, 5, 6, 3),
(9, 5, 6, 3, 3, 5, 6, 9, 6, 9)}