Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-大列表效率_Python_Performance_Loops - Fatal编程技术网

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。谢谢