Python 两个排序函数之间的效率
我创建了一个两个函数,它将整数从最低值排序到最高值,然后再回到最低值。这种类型的存在吗?无论如何,我创建了以下两个排序函数,它们产生相同的输出。我想知道这两种方法中哪一种效率最高?这两个方面我都能改进吗Python 两个排序函数之间的效率,python,sorting,python-2.7,memory-efficient,Python,Sorting,Python 2.7,Memory Efficient,我创建了一个两个函数,它将整数从最低值排序到最高值,然后再回到最低值。这种类型的存在吗?无论如何,我创建了以下两个排序函数,它们产生相同的输出。我想知道这两种方法中哪一种效率最高?这两个方面我都能改进吗 sortMiddleMax1 创建新的原始文件反向排序列表 从索引1开始,一步一步到列表长度2 sortMiddleMax2 对列表进行适当排序 从最后一个索引开始,按2逐步变为0 我试着让第二个比第一个更有效率。我没有在内存中创建新的列表,而是将其追加到末尾,而不是将整个列表向右推。我
sortMiddleMax1
- 创建新的原始文件反向排序列表
- 从索引1开始,一步一步到列表长度2
sortMiddleMax2
- 对列表进行适当排序
- 从最后一个索引开始,按2逐步变为0
def sortMiddleMax1(aList=None, verbose=False):
if aList == None or len(aList) < 2:
return aList
else:
sList = sorted(x, key=None, reverse=True)
if verbose: print sList
index = 1
while index < len(sList):
tmp = sList[index]
del sList[index]
sList.insert(0, tmp)
index+=2
if verbose: print sList
return sList
def sortMiddleMax2(aList=None, verbose=False):
if aList == None or len(aList) < 2:
return aList
else:
aList.sort()
if verbose: print aList
index = len(aList)-1
while index > 0:
tmp = aList[index]
del aList[index]
aList.append(tmp)
index-=2
if verbose: print aList
return aList
输出
############# sortMiddleMax1 #############
[9, 8, 8, 8, 7, 6, 5, 5, 4, 3, 3, 2, 1, 1]
[8, 9, 8, 8, 7, 6, 5, 5, 4, 3, 3, 2, 1, 1]
[8, 8, 9, 8, 7, 6, 5, 5, 4, 3, 3, 2, 1, 1]
[6, 8, 8, 9, 8, 7, 5, 5, 4, 3, 3, 2, 1, 1]
[5, 6, 8, 8, 9, 8, 7, 5, 4, 3, 3, 2, 1, 1]
[3, 5, 6, 8, 8, 9, 8, 7, 5, 4, 3, 2, 1, 1]
[2, 3, 5, 6, 8, 8, 9, 8, 7, 5, 4, 3, 1, 1]
[1, 2, 3, 5, 6, 8, 8, 9, 8, 7, 5, 4, 3, 1]
############# sortMiddleMax2 #############
[1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 8, 8, 8, 9]
[1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 8, 8, 8, 9]
[1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 8, 8, 9, 8]
[1, 1, 2, 3, 3, 4, 5, 5, 6, 8, 8, 9, 8, 7]
[1, 1, 2, 3, 3, 4, 5, 6, 8, 8, 9, 8, 7, 5]
[1, 1, 2, 3, 3, 5, 6, 8, 8, 9, 8, 7, 5, 4]
[1, 1, 2, 3, 5, 6, 8, 8, 9, 8, 7, 5, 4, 3]
[1, 2, 3, 5, 6, 8, 8, 9, 8, 7, 5, 4, 3, 1]
您可以使用列表切片获得结果,而无需执行for循环:
x = sorted([1,4,6,8,3,5,7,1,5,8,3,9,2,8])
x2 = x[::2] + x[1::2][::-1]
您可以使用列表切片获得结果,而无需执行for循环:
x = sorted([1,4,6,8,3,5,7,1,5,8,3,9,2,8])
x2 = x[::2] + x[1::2][::-1]
我怀疑你们目前的两个版本的性能完全相同。但是,它们都可以通过使用切片来获取列表中的值而不是通过删除和插入值来改进 每个
del
和每个insert
都是O(N)
并且您正在对每个N/2
进行排序,因此排序将是O(N^2)
。切片也是O(N)
,但只需要执行两次。排序O(N logn)
所用的时间将逐渐占主导地位
def sortMiddle3(aList):
s = sorted(aList) # sort the provided list
# now take the even indexed items, followed by the odd indexes in reverse
if len(s) % 2 == 0: # is the number of items even?
return s[::2] + s[-1::-2] # if so, the last item has an odd index
else:
return s[::2] + s[-2::-2]
示例输出:
>>> x = [1,4,6,8,3,5,7,1,5,8,3,9,2,8]
>>> sortMiddle3(x)
[1, 2, 3, 5, 6, 8, 8, 9, 8, 7, 5, 4, 3, 1]
我怀疑你们目前的两个版本的性能完全相同。但是,它们都可以通过使用切片来获取列表中的值而不是通过删除和插入值来改进 每个
del
和每个insert
都是O(N)
并且您正在对每个N/2
进行排序,因此排序将是O(N^2)
。切片也是O(N)
,但只需要执行两次。排序O(N logn)
所用的时间将逐渐占主导地位
def sortMiddle3(aList):
s = sorted(aList) # sort the provided list
# now take the even indexed items, followed by the odd indexes in reverse
if len(s) % 2 == 0: # is the number of items even?
return s[::2] + s[-1::-2] # if so, the last item has an odd index
else:
return s[::2] + s[-2::-2]
示例输出:
>>> x = [1,4,6,8,3,5,7,1,5,8,3,9,2,8]
>>> sortMiddle3(x)
[1, 2, 3, 5, 6, 8, 8, 9, 8, 7, 5, 4, 3, 1]
您可以使用Python的扩展切片<代码>[::2]表示每秒钟提取一次元素
[::-2]
意味着从末尾开始每隔一秒提取一个元素并向后工作。这里,对于偶数长度列表,第一个片段从0开始,对于奇数长度列表,第一个片段从1开始
>>> x = [1, 4, 6, 8, 3, 5, 7, 1, 5, 8, 3, 9, 2, 8]
>>> x = sorted(x)
>>> x[len(x)%2::2] + x[::-2]
[1, 2, 3, 5, 6, 8, 8, 9, 8, 7, 5, 4, 3, 1]
您可以使用Python的扩展切片<代码>[::2]表示每秒钟提取一次元素
[::-2]
意味着从末尾开始每隔一秒提取一个元素并向后工作。这里,对于偶数长度列表,第一个片段从0开始,对于奇数长度列表,第一个片段从1开始
>>> x = [1, 4, 6, 8, 3, 5, 7, 1, 5, 8, 3, 9, 2, 8]
>>> x = sorted(x)
>>> x[len(x)%2::2] + x[::-2]
[1, 2, 3, 5, 6, 8, 8, 9, 8, 7, 5, 4, 3, 1]
你有没有试着给每一个排序计时,看看哪一个最快?我不确定你对排序的定义是否正确。
[1,2,3,4,5,10,9,8,7,6]
是否为有效结果?它上升,然后下降!如果无效,您需要确切地指定输出的前半部分和后半部分是如何关联的。@David我没有给它们计时。我不是在寻找速度,而是在寻找内存占用。@Blckknght我一开始考虑过这样的排序,但我希望将最低值均匀地分布在左右两侧。基本上,我的一端是最低的,另一端是第二低的……你有没有试着给每一个都计时,看看哪一个最快?我不确定你对排序的定义是否定义得很好。[1,2,3,4,5,10,9,8,7,6]
是否为有效结果?它上升,然后下降!如果无效,您需要确切地指定输出的前半部分和后半部分是如何关联的。@David我没有给它们计时。我不是在寻找速度,而是在寻找内存占用。@Blckknght我一开始考虑过这样的排序,但我希望将最低值均匀地分布在左右两侧。基本上,我的一端是最低的,另一端是第二低的……哦,你说得对。我一直忘了它是Python3中仍然使用的少数函数之一(而不是生成器)。我会更新我的代码。很好的解释。我忘了在我的原稿中检查偶数/奇数长度,但仍然有效。@polywhill先生:是O(2N)*N/2。但即使2的倍数没有抵消,在使用大O表示法时,你通常会忽略常数因子。哦,你是对的。我一直忘了它是Python3中仍然使用的少数函数之一(而不是生成器)。我会更新我的代码。很好的解释。我忘了在我的原稿中检查偶数/奇数长度,但仍然有效。@polywhill先生:是O(2N)*N/2。但即使2的倍数没有抵消,在使用大O表示法时,通常也会忽略常数因子。太棒了!每2个切片都很棒。我从来没有试过,因为我是一个有抱负的蟒蛇学者。太棒了!每2个切片都很棒。从来没有尝试过,因为我是一个有抱负的蟒蛇。