本文目录一览:
为什么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。
python3和python2差别为什么那么大
python2和python3的区别
如果你是一个初学者,或者你以前接触过其他的编程语言,你可能不知道,在开始学习python的时候都会遇到一个比较让人很头疼的问题:版本问题!!是学习python2 还是学习 python3 ?这是非常让人纠结的!
搜索一下便会发现python3 和 python2 是不兼容的,而且差异比较大,到底学习哪个版本呢?下面就来为大家分析一下:
其实python是linux上最常用的软件之一,但是linux目前的版本大部分还是使用python2的,而且,在linux上依赖python2的程序更多一些,所以 Python3 要代替 python2 成为主流还需要几年的时间。
当初设计 Python3 的目的是没有代码兼容的包袱的情况下改进 Python,但个人认为改进得还不够大刀阔斧,没有彻底改进一些bug,还有不少的 wart 错过了改进机会,因此造成的语法不兼容的地方也没最初设想的多。
人们几年摸索慢慢下来,大部分的情况下可以直接写 2/3 兼容的代码,也有 six 这类的兼容层可用。
所以先学 Python2 还是 Python3 都不是问题,或者说都是问题。
目前现状是实际应用中大部分暂不考虑 Python3,有的时候注意写兼容 2/3 的代码。用 Python2 为主的写新代码时要考虑以后迁移到 Python3 的可能性。
无
论学 Python2 还是 Python3,都需要注意另外一边的不同点:所幸就是这些不同点很容易掌握,只有一个 unicode encoding
对较多人造成困扰(同时也是很多 web 相关库移植的主要障碍,3.3 重新支持 u”,情况大大改善了)学习python2 还是
python3 、使用python2 还是 python3 需要看具体情况而定.
所以我建议:
1. 如果是你在企业中,需要用到python而学习python的话,那就要看企业的应用python的版本进行学习;
2. 如果想要更多的成熟解决方案,最少的bug,最稳定的应用那就用python2 ;
3. 如果你是在读大学的学生,那我建议你学习python3,等到毕业的时候或许python已经成为了主流。
python和java哪一个比较好学?各自的就业前景怎么样?
从以后的发展来看,这两个编程语言肯定是要通吃的,但前期的学习,可以有一个侧重点,说一下我自己的观点。
应题主要求,从就业应用前景和学习难易度来分析一下:
一、Java
1、就业应用前景
从目前的招聘量上来看,Java在编程语言中可以说是常胜将军,经常有各种新出的编程语言向它发起挑战,但是Java始终立于不败之地,Java工程师的需求量稳稳超前,对于我们大学生来说,只要你拥有足够精湛的技术水平,那工作是没有问题的。
2、学习难易度
Java可以说是非常经典的面向对象的编程语言,Java里对于对象的思想表达的淋漓尽致,同时对于程序的原理、细节都讲述的很好,包括图形界面的设计什么的,现在主流的软件还是以Java为主,所以我觉得Java可以说是一个程序员必学的语言。
对于Java的学习难易度,跟python相比,前期的入门学习可能会有一定的难度,后期难度相当。
二、Python
1、就业应用前景
Python在国外应用相对成熟,在国内还处于起步阶段,近两年,随着人工智能、机器学习的、大数据以及云计算的兴起,Python发展势如破竹,很多企业开始进入该行列,Python人才的需求量也在不断上升,但相对于发展较为成熟的Java来说,需求量还是较少。
2、学习难易度
Python 比Java 更加简单易学。比如,读写一个相同的文件,如果Java需要十行的代码,而在 Python 中只要两行就可以达到效果。另外,Python类库非常丰富,有现成的模板可以套,省去了初学者去添砖加瓦造基垒的时间。
总结一下:如果你未来要立志成为一个专业的程序员,建议先学习Java(或者C#也行,两者有很多原理上很像,实在不行,C/C++也可以),Java是程序员公认的专属语言。如果你只是想玩玩,感受一下,或者是把编程语言作为一个工作中的工具而已,Python是个不错的选择。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/259505.html