Python 选择排序比气泡排序慢吗?

Python 选择排序比气泡排序慢吗?,python,sorting,go,microbenchmark,Python,Sorting,Go,Microbenchmark,我在做一些编码来练习算法,我发现了一些奇怪的事情,当我用Python实现简单的分类器时,随机输入99个元素,选择排序比冒泡排序快: 这是我在Python中的bubble和insert排序实现: 从输入导入列表,输入TypeVar T=TypeVar'T' def气泡分离器:列表[T]->列表[T]: 使用气泡排序算法对列表进行排序 如果不是元素: 返回元素 对于范围为0,-1的mx: 对于范围1中的idx,mx: 如果elems[idx-1]>elems[idx]: 元素[idx-1],元素[i

我在做一些编码来练习算法,我发现了一些奇怪的事情,当我用Python实现简单的分类器时,随机输入99个元素,选择排序比冒泡排序快:

这是我在Python中的bubble和insert排序实现:

从输入导入列表,输入TypeVar T=TypeVar'T' def气泡分离器:列表[T]->列表[T]: 使用气泡排序算法对列表进行排序 如果不是元素: 返回元素 对于范围为0,-1的mx: 对于范围1中的idx,mx: 如果elems[idx-1]>elems[idx]: 元素[idx-1],元素[idx]=元素[idx],元素[idx-1] 返回元素 def选择\u分拣机:列表[T]->列表[T]: 使用选择排序算法对列表进行排序 如果不是元素: 返回元素 n=lenelems 对于0,n范围内的i: smidx=i 对于i+1范围内的j,n: 如果elems[smidx]>elems[j]: smidx=j 元素[i],元素[smidx]=元素[smidx],元素[i] 返回元素 当然,使用PyTest和PyTest基准的测试:

随机输入 从排序导入* 条目=[48, 41, 23, 97, 36, 12, 78, 47, 62, 74, 69, 42, 94, 82, 35, 5, 7, 68, 73, 83, 49, 11, 56, 70, 8, 2, 24, 52, 89, 37, 50, 93, 61, 88, 91, 60, 95, 32, 29, 9, 28, 79, 30, 99, 45, 27, 19, 55, 46, 72, 96, 81, 14, 86, 22, 1, 63, 3, 34, 31, 59, 58, 66, 65, 80, 84, 92, 20, 75, 25, 67, 64, 90, 33, 18, 44, 54, 40, 38, 16, 98, 77, 71, 51, 4, 21, 53, 43, 87, 57, 39, 6, 76, 13, 10, 15, 85, 17, 26] 期望值=ListRange100 def测试\u气泡\u排序基准: x=entry.copy assert benchmarkbubble_sort,x==预期值 def测试\选择\排序基准: x=entry.copy 断言基准点排序,x==预期值 现在,当我尝试在Go中实现相同的算法时,我的select sort实现得到了更糟糕的结果:

包算法 func BubbleSortelems[]int[]int{ 如果元素==nil{ 归零 } 对于mx:=lenelems-1;mx>=0;mx-{ 对于idx:=1;idx元素[idx]{ 元素[idx-1],元素[idx]=元素[idx],元素[idx-1] } } } 返回元素 } func Selectionelems[]int[]int{ 如果元素==nil{ 归零 } n:=lenelems-1
对于i:=0;i首先,用一组固定的数字对排序算法进行基准测试是没有意义的,因为排序所涉及的步骤数不仅取决于算法,还取决于特定的输入。一个算法可能在一个输入下更快,另一个算法在不同的输入下更快

忽略这一点,您的Python代码甚至不会测量对特定数组进行排序的性能。相反,它只接受一个全局数组,在执行基准测试之前(即在多次运行排序函数之前)复制它entry.copy,对它进行一次准确排序,然后对已排序的数组进行一次排序。因此Python代码测量原始输入的一个排序和已排序输入的多个排序

与此相反,Go实现从每次运行sort函数的新数组开始。因此,您的Go代码测量原始输入的许多排序


换句话说:您在Python和Go中测量的是完全不同的东西。

请注意,因为您使用了一个单例变量,所以数组在所有测试中只排序一次……因此,您基于单个预定义数组进行基准测试,即使不同的排序算法基于特定的输入有不同的运行时?您应该在least使用大量不同的输入来实际比较您的实现,除非您的实现将只与您用于基准测试的一个特定输入一起使用。此外,如果数组已经排序,则BubbleSort的速度非常快,而在单次运行之后,即基准测试中的所有其他迭代都在已排序的数组上运行y、 谢谢@mh cbon我想你的回答给了我很多启示我真的认为Go测试为每个基准创建了一个单独的过程,就像PyTest一样,你的评论非常有用!@mh cbon我更改了测试,数字相似,气泡排序仍然比我使用Go而不是Python的测试中的选择排序快,仍然是faster@cpieto是的,我明白了。我相信这里发生了一些事情。但是,除非你提供更多的数据来证明你的发现,否则很难让人们感兴趣。这两种算法都与总迭代次数有关,所以一种算法应该比另一种算法大两倍。我也怀疑这一点,所以我改变了Python中的测试以确定基准rection_sort,entry.copy==预计将始终以数组的新副本开始。数字仍然非常高similar@cprieto:benchmark正在使用单个entry.copy的结果运行多个selection\u sort,并且不会为每次selection\u sort调用调用entry.copy。您必须在排序例程本身中进行复制,以确保不要改变我的想法 nput值。