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