为什么python内置的sort比自己写的快速排序快100倍?

如题所述

主要原因,内置函数用C写的。在Python语言内无论如何造不出内置函数的轮子。这也是通常C跟C++语言用户更喜欢造基础算法的轮了的原因。因为C/C++用户真有条件写出匹敌标准库的算法,但很多高级语言不行,不是程序员技术差,是客观条件就根本做不到。

你比如说Java语言没人造字符串的轮子,C++光一个字符串类就有无数多的实现。是因为C+用户更喜欢写字符串类吗?显然不是,一方面是因为Java语言内没法造出匹敌Java内置标准库算法的轮子,而C++真的可以,另外一个比较惨的原因是C++标准库的字符串功能太弱了,大多数高级语言的字符串类功能都比C+标准库字符串类功能更强。

写C++的时候一大错觉就是我觉着我能比标准库还快,同样的道理放在Python里面也同样适用,不管是Python各种常用package或内建函数,基本上都针对实用场景作了优化,自己手写的算法一般是比不上内建算法效率的,这也是为什么用Python时不鼓励自己造轮子的原因。

回到这个问题,Python内建的sort本质上为C实现的函数,本身执行效率就会比Python快很多,并且会根据不同的数据规模采用不同的排序算法,故效率一般都会优于自己在Python里面手写的排序更何况题主写的是基于递归的quicksort9,额外时间开销大。

因为python内置的sort是用c语言写的,如果你用c语言或者c++写的话肯定是可以做到一样快的至于为什么python计算效率比c语言能慢100倍这个具体的原理我不清楚,不过鉴于知乎上已经有很多大佬解释过这个问题,我就不在这里班门弄斧了

还有底下扯timsort的,快排序是所有比较排序算法里平均性能最优的一族算法,像C++和rust里的unstable_sort都是用的快排序。可能在一些情况下,比如数组几乎有序时,timsort会比快排序快。但是你随便给一个数组,比如像题主那样随机一个一百万大小的数然后排序,timsort是绝对不可能比快排序快的。绝对不可能。快的这100倍和timsort屁关系都没有。

我是C/C++程序员,我可以很负责的告诉你,在用天下现有所有高级语言进行排序的问题上,C要是认了第二,则没人敢认第一。所以,我猜,Python以及好多其他高级语言,都会时不时直接上C语言写的静态库和动态库。我自己也造了不少轮子,有部分是因为刚刚起步,对系统API和函数库不熟悉,找不到适合的,所以自己造轮子,后来发现了有更好的,我把我写的抛弃了。但这里也不排除有一部分是因为我个人觉得还有优化的空间,所以自己用C语言重新造了一个轮子,这样效率比现成的更优。

所以说,要论高级语言的鼻祖,还真非C莫属,从执行效率上讲,别说python,JAVA,C#,VB,甚至C的亲儿子C++,在同一个程序员手中,都没法与C抗衡,所以说,这些语言都是排着队等着被C吊打的,也正因为如此,所以,像python这类高级语言,有自带函数可用的,最好别想着自己重新造轮子,因为你不可能造出比自带函数更快的轮子。

内置库函数都是用C实现的,肯定要比手写的Python程序执行效率更高,此外内置排序Timsort相比本科课程上学的时间复杂度为Onlogn的排序算法做了很多常数优化,所以对于普通人而言,不要希望纯手写出来的东西效率能和标准库相当了。另外,题主写的排序是过不了LeetCode上的裸排序题目的,随机选取pivot对于快速排序是最基本的优化虽然题主排的是随机数,现在这么选肯定不是效率低的主要原因。

所以说了,py几乎得把自己的循环体拆了,这就是py和c/c++的性能差距,必须尽量用内置函数和numpy来处理数据,一旦手写循环体。,那你就得知道这可能得慢百倍,像用opency的py版时你不小心写个双循环来处理数据,那酸爽,而cppc#搞opencv就能随意用指针来写循环,这也是为啥他们其实不需要numpy这种组件,自身就有足够的性能和灵活度来处理这个。

Cpp内置的排序是快排和堆排的结合,最坏时间复杂度为nlogn,而快排最坏是n2。至于python内部的排序,我认为是一个道理,不会简简单单是一个快排,举个简单例子,当你数据已经是有序的时候,再传入快排肯定就不合适。那你设置排序函数的时候,是不是预先将他打乱,再进行快排会更好呢。当然具体不会这么简单,只是我认为官方给的接口都是很精妙的,很值得学习。

一方面Python中sort函数是用C语言写的,C++内部的sort是由快排,直接插入和堆排序混合的,当数据量比较大的时候先用的快排,当数据量小的时候用直接插入,因为当数据量变小时,快排中的每个部分基本有序,接近直接插入的最好情况的时间复杂度O(n),就比快排要好一点了。

另外一方面这个的底层实现就是归并排序。,只是使用了Python无法编写的底层实现,从而避免了Python本身附加的大量开销,速度比我们自己写的归并排序要快很多,所以说我们一般排序都尽量使用sorted和sort。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2022-08-12

不懂python的sort()是如何排序的?其实想解决这个问题也不难,下面让小编带着大家一起学习怎么去解决,希望大家阅读完这篇文章后大所收获。很多时候我们的需要排序,例如下面这个情况:l = [[2,3], [6,7], [3,34], [24,64], [1,43]]可能我们需要按按照没个元素的第一个数值的大小进行排序。


如果第I个元素是I ,我们希望通过I[0]进行排序解决办法是:先定义一个方法,这个方法就是来返回第一个数的,比如,我们传递第一个元素过去[23],我们得到的是=>2def getKey(item):        return item[0]然后,我们使用强大的sort()函数sorted(l, key=getKey)然后,我们就得到我们想要的了…..[[1,43], [2,3], [3,34], [6,7], [24,64]]再来一个:

B={"name": "c","age":22,"tel":711749632 }, {"name": "a","age":22,"tel":586665984 }, {"name": "b","age":5,"tel":303493120 }, {"name": "e","age":6,"tel":1412341760 }

现在我们想按照name进行排序B2 = sorted(B,key = lambda x:x['name'])一样这个是一个比较简单的写法,我们当然可以先顶一个函数def getName(s):    return s['name']然后B3 = sorted(B,key=getName)结果一样

感谢你能够认真阅读完这篇文章,希望小编分享python的sort()是如何排序的内容对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,遇到问题就找亿速云,详细的解决方法等着你来学习!程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。

第一行:l = []定义一个空的列表变量l第二行:for i in range(3):x = int(input('输入整数:\n'))l.append(x)依次输入三个原始数据,并将它们转换成整数类型,组成一个新的列表l第三行:l.sort()这是python内置的函数sort,用它可以轻松的实现对列表的数字排序sort函数介绍:sort() 函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数。

语法:list.sort( key=None, reverse=False)参数key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元向来进行排序。reverse -- 排序规则,reverse = True 降序, reverse = False 升序(默认)。

返回值该方法没有返回值,但是会对列表的对象进行排序。第四行:print (l)接下来就是输出有序的列表l进阶:我们用这个不仅可以实现三个数字的列表排序,也可以实现N个数字的列表排序,同时可以实现对很多对象的排序是不是很便捷呢结束语总体来说思路只要有了,以后遇到类似的问题就可以解决了,是不是发现原来Python可以这么神奇!

第2个回答  2022-08-09
这是通过程序设定来进行的排序,一般比自己写的要快一些,这也能够更好地体现机械化的优势。也是科技进步的结果
第3个回答  2022-08-09
因为python本事就比sort的执行效率快很多,这个是真的很不错的。
第4个回答  2022-08-20
因为python是用c语言实现的,内置sort()方法也是用c写的,运行速度很快,但是如果自己用python写排序算法,因为python比c++慢,所以速度慢。我自己写的冒泡排序就比sort()慢17倍,另外,sort()还可以排序字符串
相似回答