本文目錄一覽:
為什麼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/zh-hant/n/259505.html