【问题标题】:I would like explanations on python list management optimisation, and overall, optimisation [duplicate]我想解释一下python列表管理优化,以及整体优化[重复]
【发布时间】:2014-12-08 06:05:37
【问题描述】:

我很难理解在 python 中花费时间的原因。 特别是在一个示例中,快速排序程序。以下是一些网站认为是 python 中快速排序的最佳实现:

def theirquicksort(list):
    """Quicksort using list comprehensions"""
    if list == []:
        return []
    else:
        pivot = list[0]
        lesser = theirquicksort([x for x in list[1:] if x < pivot])
        greater = theirquicksort([x for x in list[1:] if x >= pivot])
        return lesser + [pivot] + greater

这是我期望的快速排序的最佳实现(以及我们在学校学到的作为良好实现的东西):

def myquicksort(list):
    """Quicksort not using list comprehensions"""
    if list == []:
        return []
    else:
        pivot = list[0]
        lesser,greater=[],[]
        for i in list[1:]:
            if i < pivot:
                lesser.append(i)
            else:
                greater.append(i)
        return myquicksort(lesser) + [pivot] + myquicksort(greater)

在他们的快速排序中,当调用迭代列表时,python(我猜?)在列表中运行两次,取或不取更小/更大的元素。 在 myquicksort 中,python 只在列表中运行一次,因此没有任何用处。我的意思是它不会与 i 进行两次比较。 因此,以纯粹的数学方式,它应该更快。 然而,事实并非如此。为什么?

关于优化的另一个问题,即使它不那么重要: 当我想添加/乘以其他东西时,“其他东西”取决于条件,通常的方法是:

if condition:
    a+=3
else:
    a+=1

例如。 但是如果我使用:

a+={True:3,False:1}[condition]

我会浪费很多时间吗?我会浪费时间吗?乍一看,使用第一种可能性没有问题,但在计算过程中,除此之外可以放在一行中,其中添加 1/3 - 当然只是一个例子 - 不是第一个,也不是最后一次进行的操作,第二种可能性可能很有吸引力。但这意味着调用字典类。那么,它有多聪明?

【问题讨论】:

  • 在 Python 中分析代码性能的一种方法:docs.python.org/2/library/timeit.html 请注意,Python 中的内置排序方法很可能是在本机代码中实现的 Quicksort 的优化变体,并且可能优于任何 Python 源代码代码解决方案。
  • @Matt Coubrough Quicksort 就是一个例子,这里。我不怀疑综合列表更快,内置实现总是更好,但我想了解为什么会这样。 (我的意思是,综合清单之一)
  • 确实是重复的,为此道歉。我在相关问题列表中看到它,但由于我不明白“分区例程”是什么意思,所以没有查找它。

标签: python list optimization quicksort


【解决方案1】:

最好每个问题都问一个问题。第一部分由Python quicksort - List comprehension vs Recursion (partition routine)回答

那么你问题的第二部分可以表示为

a += 3 if condition else 1

但我发现这很难阅读,并且更喜欢你展示的 if/then。二进制测试的字典对于测试来说有点过头了。

【讨论】:

    猜你喜欢
    • 2012-10-27
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多