python内置函数降序 python 降序( 四 )


还有底下扯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 。
python中对组合数据类型x进行排序的内置函数是python有两个内置的函数用于实现排序,一个是list.sort()函数,一个是sorted()函数 。

推荐阅读