為什麼Python運算慢還拿來搞AI?
好了,此問題終結。我已經準備用Cpp給Python寫庫了,Python確實AI開發的不二選擇。各位回答非常精彩,感謝。
因為用這些框架寫的程序只是「表示某個計算過程的 DSL」,這個 DSL 支持自動微分之類的操作,然後 DSL 的執行是交給 C/C++ 或者 CUDA 後端來做的。
python只是前端。。。
下面都是拿cpp 的。。。。純粹是py表達性很好,所以這麼做,因為dl的框架其實類似於寫了一個dsl
(所以我好奇為什麼不搞搞Scala前端。。。因為python對新手友好么……先看是不是:
目前最熱的Tensorflow,C++寫的,提供了C++ API和Python API(其中C++API似乎都沒文檔)
Torch,C寫的,提供了Lua API;PyTorch提供了Python API。
老牌Theano,C寫的,提供了Python API。
青壯MXNet,C++寫的,提供了C++、JS、Scala、R、Julia、Python、Matlab、Golang諸多語言的API。
大家說白了都是做的符號計算,都是先定義計算圖再來算用原生C/C++做的庫來算內容,那定義計算圖用什麼語言對效率其實沒有半毛錢影響啊,慢就慢唄,計算本身又不受到影響。
那麼Python這種寫起來容易表達能力強而且相對容易學的語言自然更容易拿來做膠水咯。幾乎所有的框架底層都是C++寫的,只是提供了python等高級語言的介面而已。
問:為什麼底層用C++?
答:運行快啊,另外,還要寫不少CUDA代碼啥的呢,python也不能直接往顯卡上塞啊。
問:為什麼上層用python等?
答:開發修改簡單快捷啊。1,搞演算法研究的人中編碼能力層次不齊,好多都是沒有經過專業編程訓練的,python對他們也很友好,pythonic不pythonic其實也不重要( 你多讀一些這方面的python代碼,就會發現不是那麼pythonic的,按理用python這麼多應該寫很pythonic的代碼,實際並不是);2,搞研究的代碼 很多都是一次性的,就使用一次而已,python寫寫調試調試10分鐘弄出來用一次,你用C++寫寫調試調試2小時弄出來就用一次(寫完後都忘了剛才想幹啥來著),用腳趾頭想想都知道python好。
最後另外,雖然各種庫都提供了python介面,但是你要真想用他們的c++介面,可以用到比python更多的介面,但一般沒什麼用啦,因為有用的都已經封裝python了。
喵?我畢設拿Python寫了一個優化的決策樹,氣的我差點把電腦摔了(別誤會,我生氣是因為我居然腦殘的用py實現ml演算法!),改成C++後我順利畢業了。py優美是因為它只實現邏輯層,使用戶能夠快速便捷的使用,演算法底層它還是調用的C++做的。
python優美,適合調包調參。
調的包都是c/c++寫的,99%的運算量都在這裡。反正一跑都是一兩小時起,把python換成其他語言也沒有絕對的提升。比如你跑一個分類,總共需要20個小時,python部分花0.2小時,即使你把python換成c++,java節約的時間能有0.1小時就非常恐怖了,而剩下的19.8個小時是不變的。
最後,你在一個領域內要選擇使用哪種語言,其實最大的原因是因為:
之前搞ai的人用慣了,懶得換。因為Python 運算慢所以運算並不是用Python 算呀!
Python 作為天生對C 語言就有極佳親和力而且還書寫簡便的膠水語言,用在AI 系統邏輯複雜但運算並不密集的主控部分真是再合適不過了。永遠不要捨棄架構換性能。其實還真就是Python 庫多。
如果說需要語法簡潔和優雅,其實很多腳本語言都可以做到。如果說要性能,Lua神馬的性能比python也要好很多。當然我知道Python 粉絲會說可以利用向量化運算神馬的提升性能,但是其他腳本語言也可以用向量化運算提升性能。別的不說,就說pypy吧,性能比cpython 提升那麼多,可是科學計算領域有多少人會去用呢?歸根結底還是庫的問題。
至於科學計算這個領域,完全是當初的python設計者們始料未及的,所以Python 基本上沒怎麼為科學計算做語法上的優化,在貼近科學計算方面真不如matlab和julia。
所以歸根結底就是,Python 因為歷史原因,有大量的庫,一個語言能實現的功能很大程度上取決於它的庫。這也是為什麼會存在python2.7和3.5的分裂,許多人寧可忍受2.7的各種問題也要去使用,撇去兼容老代碼不談,其實很多時候為的是那些需要使用的庫。
一般的開發流程中,決定性的不是最優的東西,而是最蠢的東西。cpp就是對電腦很友好,python就是對人很友好。
而對搞AI這件事來說,最蠢的東西是人。
Python搞AI是因為它簡單好寫,慢不慢與它無關,它沒有參與運算。
Python簡單啊~
很多做演算法的人受到的訓練都是演算法相關,而工程師的代碼水準是另一套不同的能力體系。
所以一門簡單方便又容易上手的語言就是演算法工程師最好的選擇了。
畢竟演算法的核心在於演算法,而不是在語言的效率上。
另外,C和Java用來做演算法的也並不少的。
1. python對開發者很友好2. python只是前端,後端計算密集的可用C/C++等來實現
因為C++傻大笨粗,雖然算得快,但不適合定義數學運算,如果不用Python(以及其它動態語言),就得自己造一個dsl,然後再寫一個它的解析器。
後來一看,動態語言基本都有共享庫的互操作,那就好辦了,把實現邏輯拿C/C++寫,做成共享庫提供介面,然後拿 Python調用,豈不美哉。其實很多 Python上的包,並非為了性能,而是為了省事,最大限度利用歷史代碼,也會這麼干。py是各種工具溝通的最好的語言,溝通本身耗時很少,溝通輕鬆方便最重要...所以py最好。
主要還是maven這一套東西對於researcher而言學習成本太大,不然幹嘛要用python這麼難用的語言
Python調用c/c++/cuda庫很方便,底層全是c艹/cuda寫的,Python只是一個api。最明顯的是mxnet,c艹寫的,Python/MATLAB都能調用
因為慢的部分都是C/C++寫的啊
在C/C++的API外麵包一層用的爽的語言。
當然是選擇 Python。首先建議大家去搜索下deeplearning4j(for java),再來看待這個問題。
很多人誤解了,以為是一群不懂其它編程語言的人只能抱著Python取暖,但是事實不是。Python上位AI不是推舉制的結果,而是淘汰制的結果。也就是說不是「選擇」用Python,而是各領風騷後Python稍微佔領了高地。
Numpy庫本身並不支持GPU加速,需要開發人員自己去支持,其它科學計算庫以前也沒多少用在AI上,在庫這裡Python又有什麼優勢呢?(其它庫估計還不上用來畫圖matplotlib使用頻率高)
老牌的庫Torch用的是Lua,像Google的word2vec直接用C語言寫的,也有很多用matlab的,不存在什麼歷史遺留問題。
用什麼語言本質上又沒有什麼區別,AI優劣又不是用所用的編程語言判斷,喜歡什麼就用什麼。你沒看到deeplearning4j,只能說喜歡用Python或者只能用Python的人太多了。畢竟不是誰都買得起matlab嘛。個人觀點。
對於搞演算法的來說,好上手是個特別重要的事。
有什麼想法,能迅速的從數學公式變成程序,然後驗證,是個特別重要的過程。
動態語言的優勢就在於此。
君不見matlab比python還慢呢,但是是科研必備語言。
正因為演算法不易學,所以把更多的時間拿來做演算法研究,而不是調試程序,是個特別高效的事情。
至於運行效率,反正有的是時間讓程序自己跑。
直到等到演算法驗證成功之後,要做商業化了,再考慮轉到效率更高的語言上嘛。
運行效率低可以用硬體的發展和進步彌補,但是如果開發效率低的話就可能在需要的時間點拿不出來產品了。後者可能是致命的,而前者其實沒你想的那麼嚴重。再說Python用好了,也不會慢到哪裡去。
推薦閱讀:
※如何利用技術避免車禍?
※人工智慧(AI)的發展對交易員這一職業有何影響?
※如何看待地平線機器人余凱最新發布的人工智慧晶元?
※无人车在未来会有什么样的应用场景?
※数据科学工作者(Data Scientist) 的日常工作内容包括什么?