Python-大列表效率
我有一个函数,Python-大列表效率,python,performance,loops,Python,Performance,Loops,我有一个函数,unique(a),它接受一个数字列表,a,每个值只返回一个。同时,它维护列表的顺序。我还有一个函数,big\u list(n),它生成len(n)的列表 我之所以反转列表的方向,是因为在移除值时,它会将它们从原始列表的后面移除,只是为了在将修改后的列表与原始列表进行比较时使其更清晰可读 当我创建的列表长度相对较小时,该函数可以工作,但当我创建的列表长度较大时,如ex为1000000,执行时间将永远花费 如果有人能帮助我,使我的功能更快,那将是伟大的 仅供参考:我需要在函数中的某个
unique(a)
,它接受一个数字列表,a
,每个值只返回一个。同时,它维护列表的顺序。我还有一个函数,big\u list(n)
,它生成len(n)
的列表
我之所以反转列表的方向,是因为在移除值时,它会将它们从原始列表的后面移除,只是为了在将修改后的列表与原始列表进行比较时使其更清晰可读
当我创建的列表长度相对较小时,该函数可以工作,但当我创建的列表长度较大时,如ex为1000000,执行时间将永远花费
如果有人能帮助我,使我的功能更快,那将是伟大的
仅供参考:我需要在函数中的某个位置使用一个集合,用于我正在处理的作业。我还需要从后面删除列表项
提前谢谢
def big_list(n) :
# Create a list of n 'random' values in the range [-n/2,n/2]
return [ randrange(-n//2, n//2) for i in range(n) ]
def unique(a) :
a = a[::-1]
b = set(a)
for i in b :
while a.count(i) != 1 :
a.remove(i)
a.count(i)
a = a[::-1]
return a
您的算法在移动元素时做了大量额外的工作。考虑:
def unique(a):
b = set()
r = []
for x in a:
if x not in b:
r.append(x)
b.insert(x)
return r
您的算法在移动元素时做了大量额外的工作。考虑:
def unique(a):
b = set()
r = []
for x in a:
if x not in b:
r.append(x)
b.insert(x)
return r
每次调用
a.count(i)
时,它都会在整个列表中循环以统计发生的次数。这是一个O(n)操作,你反复重复。当您将b:循环中i的外部的O(n)运行时考虑在内时,总体算法复杂度为O(n2)
在while
循环中存在第二个不必要的a.count(i)
,这并没有帮助。那个电话除了浪费时间外什么也没用
整个问题可以在O(n)时间内完成。最好的办法是完全避免使用list.count()
,并找出如何在列表上循环并自己计算元素。如果您很聪明,您可以在一次传递中完成所有操作,不需要嵌套循环(或隐式嵌套循环)。每次调用a.count(i)
它都会在整个列表中循环,以统计发生的次数。这是一个O(n)操作,你反复重复。当您将b:
循环中i的外部的O(n)运行时考虑在内时,总体算法复杂度为O(n2)
在while
循环中存在第二个不必要的a.count(i)
,这并没有帮助。那个电话除了浪费时间外什么也没用
整个问题可以在O(n)时间内完成。最好的办法是完全避免使用list.count()
,并找出如何在列表上循环并自己计算元素。如果你很聪明,你可以在一次传递中完成所有事情,不需要嵌套循环(或隐式嵌套循环)。你可以在下面找到一个完整的“独特”函数基准。我个人最喜欢的是
def unique(seq):
# Order preserving
seen = set()
return [x for x in seq if x not in seen and not seen.add(x)]
因为它是最快的,并且在巧妙地使用集合的同时保持了顺序。我认为是f7,评论中给出了它。你可以在下面的网站上找到“独特”函数的完整基准。我个人最喜欢的是
def unique(seq):
# Order preserving
seen = set()
return [x for x in seq if x not in seen and not seen.add(x)]
因为它是最快的,并且在巧妙地使用集合的同时保持了顺序。我认为它是f7,它在评论中给出。Set已经是唯一的了。它将不包含重复项。i、 e.x=set(big_list(10k)),x将没有重复项。这不正是它成为时间复杂度最差示例的原因吗?set已经是唯一的了。它将不包含重复项。i、 e.x=set(big_list(10k)),x将不会有重复项。这不正是它成为时间复杂度最差示例的原因吗?谢谢!在迭代列表时创建一个新列表是否通常更好,就像您刚才在示例中所做的那样?Python以这种方式创建新列表非常有效。另一种方法是执行大量的.remove()
操作,这些操作必须大量移动元素,特别是当您有许多元素要逐个删除时。谢谢!在迭代列表时创建一个新列表是否通常更好,就像您刚才在示例中所做的那样?Python以这种方式创建新列表非常有效。另一种方法是执行大量的.remove()
操作,这些操作必须大量移动元素,特别是当您有许多元素需要逐个删除时。谢谢您的建议!谢谢你的建议!我以前看过那个页面,只是我没有意识到有一个f7。谢谢我以前看过那个页面,只是我没有意识到有一个f7。谢谢