【发布时间】: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