是什麼緣由致使Python運算效率這麼低呢?

Python是一門目前很流行的編程語言,因其語法簡潔、功能強大、上手簡單,目前已普遍應用於人工智能等領域,可是python運算效率低,具體是什麼緣由呢,下列羅列一些:python

第一:python是動態語言編程

一個變量所指向對象的類型在運行時才肯定,編譯器作不了任何預測,也就無從優化。舉一個簡單的例子: r = a + b。 a和b相加,但a和b的類型在運行時才知道,對於加法操做,不一樣的類型有不一樣的處理,因此每次運行的時候都會去判斷a和b的類型,而後執行對應的操做。而在靜態語言如C++中,編譯的時候就肯定了運行時的代碼。安全

另一個例子是屬性查找,關於具體的查找順序在《python屬性查找》中有詳細介紹。簡而言之,訪問對象的某個屬性是一個很是複雜的過程,並且經過同一個變量訪問到的python對象還均可能不同(參見Lazy property的例子)。而在C語言中,訪問屬性用對象的地址加上屬性的偏移就能夠了。網絡

第二:python是解釋執行,可是不支持JIT(just in time compiler)。雖然大名鼎鼎的google曾經嘗試Unladen Swallow 這個項目,但最終也折了。多線程

第三:python中一切都是對象,每一個對象都須要維護引用計數,增長了額外的工做。併發

第四:python GIL,GIL是Python最爲詬病的一點,由於GIL,python中的多線程並不能真正的併發。若是是在IO bound的業務場景,這個問題並不大,可是在CPU BOUND的場景,這就很致命了。因此筆者在工做中使用python多線程的狀況並很少,通常都是使用多進程(pre fork),或者在加上協程。即便在單線程,GIL也會帶來很大的性能影響,由於python每執行100個opcode(默認,能夠經過sys.setcheckinterval()設置)就會嘗試線程的切換,具體的源代碼在ceval.c::PyEval_EvalFrameEx。編程語言

第五:垃圾回收,這個多是全部具備垃圾回收的編程語言的通病。python採用標記和分代的垃圾回收策略,每次垃圾回收的時候都會中斷正在執行的程序,形成所謂的頓卡。infoq上有一篇文章,提到禁用Python的GC機制後,Instagram性能提高了10%。感興趣的朋友能夠去仔細研磨。ide

兔子動態IP致力於爲各行業提供最優質的網絡服務,不只能夠提供動態IP服務,還能夠提供企業級爬蟲代理IP服務,爲您提供安全穩定、高效便捷的爬蟲代理IP服務,提供代理IP資源的同時,還能夠設置不一樣類型的HTTP代理,以及設置去重等等標準,助您不間斷獲取行業數據,助您輕鬆跨入 「人工智能」時代。性能

相關文章
相關標籤/搜索