python函数sort python函数sorted怎么传递参数( 二 )


写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内部的排序,我认为是一个道理,不会简简单单是一个快排 , 举个简单例子 , 当你数据已经是有序的时候,再传入快排肯定就不合适 。那你设置排序函数的时候 , 是不是预先将他打乱,再进行快排会更好呢 。当然具体不会这么简单,只是我认为官方给的接口都是很精妙的,很值得学习 。