tensorflow框架 Python語言其實很慢,為什么機器學習這種快速算法步驟通常還是用呢?
Python語言其實很慢,為什么機器學習這種快速算法步驟通常還是用呢?對于那些使用了多種開發(fā)語言(Java、C#、nodejs、Erlang)然后轉到Python進行機器學習的人,我想談談我的看法。首
Python語言其實很慢,為什么機器學習這種快速算法步驟通常還是用呢?
對于那些使用了多種開發(fā)語言(Java、C#、nodejs、Erlang)然后轉到Python進行機器學習的人,我想談談我的看法。
首先,Python真的很慢嗎?我的回答是真的。非常慢。for循環(huán)比CPP慢兩個數(shù)量級。
那么為什么要使用Python呢?如果我們遍歷超過一億個數(shù)據(jù),兩個數(shù)量級的差異是不可接受的。但是,如果我們使用Python來執(zhí)行頂層邏輯并阻塞數(shù)以億計的數(shù)據(jù),Python只會循環(huán)十幾次,剩下的就留給CPU和GPU了。所以兩個數(shù)量級無關緊要?一毫秒和100毫秒在整個系統(tǒng)中并不重要。
Python最大的優(yōu)點是它可以非常優(yōu)雅地將數(shù)據(jù)拋出到高效的C、CUDA中進行計算。Numpy、panda、numba這些優(yōu)秀的開源庫可以非常方便高效地處理海量數(shù)據(jù),借助ZMQ、cell等還可以做分布式計算,gevent借助epoll系統(tǒng)IO優(yōu)化。因此,它不需要花費太多的精力就可以優(yōu)雅高效地完成海量數(shù)據(jù)處理和機器學習任務。這就是Python如此流行的原因。
好好想想。同樣的性能,代碼只有CPP或Java的三分之一或更少,不是很吸引人嗎?
數(shù)學好的人適合學哪種編程語言呢?
首先,好的數(shù)學,編程會容易得多。
我以前遇到過一門發(fā)展曲線良好的課程。它是數(shù)學學士學位、計算機碩士學位和經濟學博士學位。很 完美
如果你有一個好的數(shù)學基礎,你可以在學習編程的時候學習算法。當你學算術時,你能學什么語言?
R是目前最流行的統(tǒng)計分析和繪圖軟件,屬于火炮項目的開放軟件。
C作為一種高效的底層語言,積累了大量的數(shù)值算法庫,也是數(shù)值計算不可缺少的語言。
目前,所有的機器學習算法都已經熱銷,深度學習的核心基本上都是用C/C編寫的。例如,開源深度學習框架Caffe、pytorch/torch和tensorflow。
為什么Python是入行人工智能的首選語言?
人工智能是我的研究方向之一。目前我還在用Python做智能診療的落地應用。我將根據(jù)我的個人經驗談談Python在人工智能中的應用。
我是從機器學習開始研究人工智能的,因為我以前一直在做大數(shù)據(jù)相關的研發(fā),從大數(shù)據(jù)進入機器學習是很自然的。機器學習所要做的就是從無序的數(shù)據(jù)中發(fā)現(xiàn)規(guī)律,通過數(shù)據(jù)的采集和排序來訓練算法,從而實現(xiàn)最終的應用。
由于我已經使用java很長時間了,當我第一次開始實現(xiàn)機器學習算法時,我的首選語言是java。畢竟編程語言只是一個工具,哪個工具好用,所以我總是用java來實現(xiàn)。直到有一次我參加了一個機器學習交流會,一位同行推薦我用Python來做機器學習。他告訴我Python做機器學習非常簡單,你不必過多考慮語言實現(xiàn),你可以專注于算法。
我花了大約一個星期的時間學習python,然后我開始在使用python時熟悉它?,F(xiàn)在我們已經使用Python好幾年了,可以說Python非常適合算法實現(xiàn)。一方面語法簡單,另一方面可以使用的算法庫非常豐富,而且程序可以快速調整,所以用Python做機器學習讓我感覺輕松了很多。
目前,我的登陸項目也已經用Python完成了。雖然速度不如Java快,但從程序開發(fā)的角度來看,使用python確實很有趣。
Java能不能像C語言不通過JVM虛擬機直接編譯成二進制機器碼,讓計算機直接運行?
從語言設計的角度看,可以通過重新設計編譯器來實現(xiàn),但從工程實踐的角度看是不可行的。
首先,Java語言最大的特點是跨平臺的可移植性,一次開發(fā),一次編譯,多平臺執(zhí)行。這個特性是通過JVM(Java虛擬機)實現(xiàn)的。如果重寫編譯器直接編譯成C語言這樣的可執(zhí)行程序,它將失去跨平臺特性。
其次,Java語言在設計之初就被設計成嚴重依賴JRE(Java運行時環(huán)境)的語言。一些語言設計缺陷必須依靠JVM來解決,比如GC(垃圾收集)。我們知道Java語言沒有內存恢復能力,所以我們不得不依賴JVM。在工程實踐中,如果軟件不能進行內存恢復,后果將是災難性的。
第三,Java語言是面向對象的,不同于同樣面向對象的C語言,Java還具有動態(tài)特性。
它允許程序動態(tài)加載運行過程中所需的類,這在面向對象編程中是C語言無法實現(xiàn)的。在C語言編程過程中,每次向類中添加實例變量或成員函數(shù)時,引用該類的所有子類都必須重新編譯,否則會導致程序崩潰。Java從以下幾個方面采取措施來解決這個問題。java編譯器沒有將對實例變量和成員函數(shù)的引用編譯成數(shù)值引用,而是將符號引用信息保存在字節(jié)碼中并傳遞給解釋器,解釋器在動態(tài)連接類后將符號引用信息轉換成數(shù)值偏移量。這樣,在內存中生成的對象不會在編譯期間確定,而是延遲到運行時并由解釋器確定。這樣,更新類中的變量和方法不會影響現(xiàn)有代碼。在解釋和執(zhí)行字節(jié)碼時,只有在出現(xiàn)新名稱時才執(zhí)行一次符號信息的搜索和轉換,然后才能全速執(zhí)行代碼。在運行時確定引用的好處是可以使用更新的類,而不用擔心影響原始代碼。如果程序連接到網絡中另一個系統(tǒng)中的類,則該類的所有者可以自由更新該類,而不會使引用該類的任何程序崩潰。這完全取決于JRE。
以上幾點決定了Java不能像C語言那樣直接編譯成機器代碼。當然,還有其他一些因素,但我認為以上幾點是最重要的。