为什么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 。
python 内置排序函数使用python内置关于排序的工具主要有两个一个是列表自带的 sort() 方法 , 另外一个是 sorted() 函数 。Python 列表内置方法可以直接修改列表 。而 sorted() 内置函数从一个可迭代对象(列表,元组等都可以)构建一个新的排序列表 。其函数原型分别如下:
对列表进行默认排序
从函数原型来看,可以看到两者都具有两个可选参数 , 它们都必须指定为关键字参数 。
key 指定带有单个参数的函数,用于从 iterable 的每个元素中提取用于比较的键 (例如 key=str.lower) 。默认值为 None (直接比较元素) 。key 形参的值应该是个函数(或其他可调用对象) , 它接受一个参数并返回一个用于排序的键 。
假设有其他类型的变量,比如一个自定义的类或者列表中又是一个列表 。以官网例子为例有这样一个列表 , 其元素为元组,
可以用以下方式按照年龄排序
类似的有自定义类
可以用如下方式进行排序
也可以显示定义一个函数,且只有一个参数,返回用于排序的键,比如
总之就是定义一个函数返回一个用于排序的键,可以用lambda函数或者 def 定义都可以 。
上面实现的简单函数实际就是实现了返回一个有序结构的第 n 的元素,或者某个类中的某个属性,因此 Python 提供了便利功能,使访问器功能更容易,更快捷 。operator 模块有 itemgetter() 、 attrgetter() 函数 。分别完成返回第 n 个元素,某个属性功能 。上面的排序可以用如下方式进行实现
在python2中,sort有一个 cmp 参数,即用一个函数来自定义比较,在python3中这种方式被取消 。为了继承类似的用法,在 Python 3.2 中,functools.cmp_to_key()函数被添加到标准库中的functools 模块中 。
这种作用先定义如何比较两个变量,以上面的学生列表按照年龄排序为例
这种做法自定义比较函数接收两个形参,返回比较结果(bool) , 而新式方法接受一个参数,返回的是比较的键 。
假设有字典 d = {'b':2, 'a':1,'c':8,'d':4} ,则可以通过以下方式对字典按照键和值进行排序
Python实现的快速排序算法详解Python实现的快速排序算法详解
本文实例讲述了Python实现的快速排序算法 。分享给大家供大家参考,具体如下:
快速排序基本思想是:通过一趟排序将要排序的数据分割成独立的两部分 , 其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 。
如序列[6,8,1,4,3,9],选择6作为基准数 。从右向左扫描,寻找比基准数小的数字为3,交换6和3的位置,[3 , 8,1,4,6,9],接着从左向右扫描,寻找比基准数大的数字为8,交换6和8的位置 , [3,6,1,4,8,9] 。重复上述过程,直到基准数左边的数字都比其?。冶叩氖侄急绕浯?。然后分别对基准数左边和右边的序列递归进行上述方法 。
实现代码如下:
def parttion(v, left, right):
key = v[left]
low = left
【python快排函数 快排 python】high = right
while lowhigh:
while (lowhigh) and (v[high] = key):
high -= 1
v[low] = v[high]
while (lowhigh) and (v[low] = key):
low= 1
v[high] = v[low]
v[low] = key
return low
def quicksort(v, left, right):
if leftright:
p = parttion(v, left, right)
quicksort(v, left, p-1)
quicksort(v, p 1, right)
return v
s = [6, 8, 1, 4, 3, 9, 5, 4, 11, 2, 2, 15, 6]
print("before sort:",s)
s1 = quicksort(s, left = 0, right = len(s) - 1)
print("after sort:",s1)
运行结果:
before sort: [6, 8, 1, 4, 3, 9, 5, 4, 11, 2, 2, 15, 6]
after sort: [1, 2, 2, 3, 4, 4, 5, 6, 6, 8, 9, 11, 15]
关于python快排函数和快排 python的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。
推荐阅读
- 学环艺关注的公众号,学环艺费钱吗
- 电商项目面试如何描述,电商项目面试如何描述自我介绍
- 如何提取ppt的字,如何提取ppt的字体
- mysql安装后怎么弄 mysql安装后怎么用
- 关于理发店如何快速推广销售的信息
- 谷歌html5播放,谷歌浏览器播放hls
- 关于长腿主播直播洗澡的信息
- java中如何调用c代码 java 调用c
- 视频号服装简介怎么写,视频号介绍模板