如何看待 python 的性能?


python的性能要從幾個方面看,如果只看標準版的語言實現本身,性能可以說是很差的,因為動態語言本身就決定了很多東西要運行時檢查,並且標準版沒有對位元組碼做jit等優化,等於是直接解釋

不過,由於python很多基礎庫是用C實現,如果庫執行比例較大,速度還是可以接受,典型例子是python的高精度計算,long類型是C語言實現,而jre中java的BigInteger是用java自己實現,因此高密度的高精度計算python還要快些,因此很多系統採用核心用C改寫的方式,和python結合使用,根據二八定律,只需改寫較少的模塊就能較大提高效率

當然,也可以直接用pypy等jit解釋器,效率也能提高不少,雖然和靜態類型語言還是有差距

最後說明一點的是,效率問題在計算比較密集的時候才體現性能瓶頸,有些網站雖然看上去業務很大,但業務本身可能不是很複雜,訪問量也並不是特別高,這個也可以估算一下


如果是計算密集型的應用,純Python的性能比C,Java什麼的要差。

一般的Web應用有大量的網路IO,磁碟IO,只有少量的邏輯判斷和計算,這種時候Python的性能劣勢不明顯。

Python需要提高計算性能的時候,可以通過C擴展,Cython,或者Pypy的途徑。

開發效率還是很重要的,這麼『慢』的一門語言,在科學計算和數據分析領域能成為主要工具語言,是有道理的。

PS:剛知道,引力波的數據是用Python分析的。http://mp.weixin.qq.com/s?__biz=MjM5NzA1MTcyMA==mid=402898347idx=2sn=9f30d9f1e2f6705cf2d0ddb30ed20086scene=2srcid=0216a5pL4oJw28Vego1kIkFXfrom=timelineisappinstalled=0#wechat_redirect


在這個行業,相信大家不止一個人也不止一次的說過類似的話:"一個成熟的系統不會是由一門語言去包打天下的」。

還有就是python 在企業中可以作為主要使用語言,比如做web開發的公司,為什麼不呢,真正涉及到密集運算的部分很少,我們可以用很多替代方案解決,例如用c重寫那部分,用python粘合,或者是用其他語言重寫,再提供service介面等等,那個不是要命的問題,業務複雜度和需求變更才是要命的,這個小時討論,只有兩個小時編碼,1個小時測試,快速發布到線上所有環境讓用戶使用才是要命的問題,這個時候你跟我扯性能,那不是搞笑嗎?

還有一點是大部分國內的企業用非python是因為能用python真正解決問題的程序員相比之下少一些,這個來自於我們內部的數據統計,我們是做智能招聘的,通過大把(千萬級)的簡歷分析得到的結果。(不是那種學了一段時間python就妄下定義的人),市場的選擇而已,並不能說明問題。

是的,我自己所在的公司就是用python做為主要開發語言,也包括科學計算,海量分析相關的東西,沒見到他們工作時說python性能差,性能差的地方只佔他們工作的百分之幾,換個語言就繞過去了,當然你要說用python去寫遊戲客戶端圖像處理那部分那就真的蛋疼了。每種語言都有他合適的應用場景。


這是我看到網友比較java和c語言的結果

再測JAVA性能比C/C++好問題 - 大師的資源 - 博客頻道 - CSDN.NET

我用python寫的代碼如下:

#-*-coding:utf-8-*-
import time
def isPrime(i):
for test in xrange(2,i):
if i % test == 0:
return False
return True

if __name__ == "__main__":
t1 = time.clock()

n_loops = 50000
n_primes = 0

for i in xrange(0,n_loops):
if isPrime(i):
n_primes += 1

t2 = time.clock()
print str(n_primes)
print "run time:%f s" % (t2 -t1)

基於numba加速代碼

#-*-coding:utf-8-*-
import time
from numba import jit

@jit
def isPrime(i):
for test in xrange(2,i):
if i % test == 0:
return False
return True
@jit
def tp():

n_loops = 50000
n_primes = 0

for i in xrange(0,n_loops):
if isPrime(i):
n_primes += 1
return n_primes

if __name__ == "__main__":
t1 = time.clock()
n_primes = tp()
t2 = time.clock()

print str(n_primes)

print "run time:%f s" % (t2 -t1)

我用python執行時間23秒,用pypy執行時間1.54秒,用numba加速為1.5秒,c語言在本機macos上執行時間1.3秒,java運行速度1.45秒(jre8),詳細見圖片,可見引入jit編譯後,性能直逼c語言,而寫python比寫c容易太多,比java簡潔,寫代碼速度也是非常非常重要。由於歷史原因,很多python庫用的c語言庫,如pandas(pandas的矩陣計算用numpy優化過非常快,可能比手寫c語言循環還要快),可以通過設計來分離c語言加速後的python代碼和pure python,分別用不同的加速方法,如numba可以單獨加速一個函數,把需要大量計算的放在一個函數用numba加速(numbapro支持顯卡加速但是商業版的)。

所以只適當設計一下,python在一般計算問題下有這些解決方案下性能不是問題,實在不行,你還可以用boost::python來寫個c/c++調用庫來解決性能問題。

下面的測試說明,對於性能,原生python比較慢,在windows下python比linux,macos要快,用pypy後相當於java,c#速度,pypy,c#在windows下受益msvc表現較快,,go語言速度表現比較穩定,c語言理論上是最快,但受環境和編譯器影響較大。對c#,java可能在GC垃圾回收時會表現不穩定,因為在oop中有大量計算後可能要回收垃圾內存對象,這個沒有用到oop,只是純計算,理論上還是c/c++語言最快。

python和java比,運行速度比java慢,java強大於改進n次的強大jre,但python在很多領域能調用很多現成的開源庫,在數據分析中有優勢,pyhton的代碼比java要簡潔,容易入門和使用。在優化的計算庫幫助下,如numpy numba,pandas,scikit-learn,python的實際問題運算性能並不低於java。java主要是框架太多,相對複雜,java主要用於業務程序開發,符合軟體工程理論,可伸縮性強,強類型有利於對程序的靜態檢查分析。java隨著安卓,hadoop,spark的興起,加入java語言的公司很多,性能也可以通過優化解決很多問題。很多伺服器如ubuntu server,centos都默認支持python,而java虛擬機需要安裝配置,python的安裝使用也相對簡單。python的庫有開箱即用感,很多業務領域,你可能還在用oop寫代碼,考慮設計模式,用鋤頭挖溝時,而python調用挖掘機api已經炒菜完工開飯了,缺點是油耗比較大。

Python和c#相比,c#依賴強大的微軟優化的.net虛擬機和強大vs ide,在windows平台下運行速度比java要快,但跨平台運行後如mono,速度就慢了,功能也不完全。c#的跨平台能力比不上python,c#比python要複雜,c#語法和java,c++借簽,比較受編程人員喜好。mono的出現,unity3d用c#調用c++做遊戲業務邏輯,可以在手機上流暢運行,體現了很多程序的性能在於良好的設計,可以把高性能的用c/c++寫,用c#,java,python寫容易變化的業務邏輯部分。c#在mon虛擬機下運行速度還可以,但linux控在伺服器上有java,python,php,所以用mono做web比較小,從unity3d的成功來看,用c#做為業務腳本語言,用c++做庫也能獲取很高的性能。這是折中性能和開發速度矛盾的一種解決方案。很多複雜的業務語言用java,c#,在團隊開發時易用性好,也說明了python的工程化比較差,對強類型的支持弱不適合靜態分析,但python一但用強類型申明,那麼是另一種java,也就不是快捷語言。在單純的計算比較,各個虛擬機語言相差不多,其實除了現代很多業務系統瓶頸在io,在網路,在演算法,在設計,你2秒運行1.2億次,而沒有資料庫或緩存能做到2秒內記錄完1.2億條數據,都是1秒在1百萬記錄以下,如果走網路速度更慢,持續平均1秒能記錄下幾十萬條數據頂天了,所以這些語言一直在等io完成任務。

python和go語言相比,go語言相對較新,go語言的庫沒有python的豐富,畢竟python發展了幾十年,go語言最大的優點是協程,速度快,支持高並發,但任何支撐高並發的語言編程都不是一件易事,最大的缺點是,名稱有google的go,所有很多其他的巨頭公司本著競爭的觀念對有類似商標的語言有抵制心理。而python是開源,用得公司特別多。go語言的語法如果能像c#,java類似,可能會發展得更好。很多語言為什麼會用它,不在於語法,不在於性能,主要在於這個語言開發了什麼成功的產品,另人會mock這個產品,用這個語言,Docker就是go語言開發的,適就於大規模分發容器。

python語言和c/c++相比,python開發速度比c/c++快,因為c/c++有指針,幹什麼之前,需要考慮好指針的技巧,指針弄不好,會造成內存泄露,一點內存泄露不要緊,但乘以時間乘數就會耗盡整個內存,因內存泄露造成的24h*365天伺服器需要重啟會造成實際經濟損失,所以開發商業後台業務程序最好用無指針的java,php,python。但對用戶來說python,java,c#,c/c++開發同樣功能的程序,用戶會選擇c/c++,所以在軟體業無數成功的標牌軟體是c/c++,這是c/c++的成熟之處。c/c++主要是開發成本高,同樣的程序可能python,c#一周,c++搞二個月很正常。但為了利益,花再多時間也有人干,如同現在一樣有人用彙編寫加密代碼,用FPGA把程序做成晶元,追求的是極致的速度。c/c++的快是直接編譯成二進位,無jit,vm,而python最快也只是調用c的擴展。開發成本也是很高的成本,高級的c++程序很貴,如在美國高級的c++程序員年薪在百萬人民幣以上,有時不是大應用時,用易於使用的語言,上高級點的電腦,上集群就可以了。如用python顯卡來加速,買個顯卡也就萬元。c/c++適合精雕細琢,走精英路線,python適合快速開發,走大眾路線,其實對於影響性能的部分可以結合使用,用python調用c/c++庫。隨著編譯技術進步,電腦的計算力成本會隨時間下降,計算力越來越強,最近的cpu多核主頻高達5g,理論上比2.5g的cpu算力快一倍,用液氮超頻可達6.7g,同樣的核也比我電腦快了1.5倍(如果用高級c++語言程序員優化了1倍時間花費1人/年,顯然超過了換計算機的錢),顯卡在多核的支持下浮點運算能力也越來越高(可用NumbaPro,PyCUDA), HPC在雲市場可以租用到,超級計算機也可以向有關組織租用機時測試,動態語言以其易用性開發成本低在很多領域可以取代高性能的編譯語言,但極致的編譯性能軟體市場也是不斷擴大的,很多行業算力跟不上,很多np-hard問題對算力需求不是線性增加能滿足的,人們對性能的需要實際是越來越高,如世界競爭的超級計算機,比特幣礦機,深度學習演算法。誰都不可以取代誰,而是大家都結合發展了。用什麼語言沒有好壞之分,關鍵是在目標程序追求的是什麼。

實際上我心中覺得最好的x語言是

java的跨平台+c#的ide和語法+python的庫+c++語言的性能+go語言的協程python在macos執行時間23.3秒,pypy在macos執行時間1.54秒,python在ubuntu下測試為13.5秒,pypy在ubuntu下測試為2.3秒。

用numba加速在macos結果為1.5秒。

python在windows7下運行時間為7.4秒,pypy在windows7下的運行時間為0.6秒。

用不同python編譯器在win7下運行的結果,pypy為0.56秒,jython為4.7秒,IronPython為5.2秒,python為6.5秒

c語言在macos運行結果1.34秒(LLVM)

c語言(vc++13)在windows7下的運行時間為0.34秒,為什麼會這麼快,可能和msvc的編譯器對windows平台數字計算優化有關。包括上面的windows下的python,用msv編譯版後速度較macos要快。c語言我在ubuntu下用打-O2優化,用gcc是2秒,用clang是1.88秒。

c語言打開-O2二級優化,用llvm和gcc,速度差不多都在1.2秒,clang要快點

java在macos運行結果1.4秒,我在ubuntu上測試為2秒。

java在windows7下的執行時間為1.23秒

go語言測試代碼如下:

package main
import (
"fmt"
"time"
)
func main() {
n_loops := 50000
n_primes := 0
t1 := time.Now() // get current time
for i := 0;i &< n_loops;i++ { if isPrime(i) { n_primes++ } } t2 := time.Since(t1) fmt.Println("Time taken=", t2) fmt.Println("primes found",n_primes); } func isPrime(i int)(bool){ for test := 2; test &< i; test++{ if i % test == 0 { return false } } return true }

go語言在macos測試結果1.1秒,我在ubuntu下測試為0.91秒

go語言在windows 7平台下1.18秒,你還可以用Grumpy,把python先轉換成go語言,再編譯go語言成二進位實現加速。

c#基於mono在macos執行時間2.84秒,在ubuntu上測試為1.8秒。

c#基於windows7執行時間1.17秒

c#代碼如下:

using System;

namespace TestPrime
{
class MainClass
{
private static long LoopCount=0L;

private static bool isPrime(long i)
{
for (long test = 2; test &< i; test++) { if (i % test == 0) { return false; } LoopCount++; } return true; } public static void Main(string[] args) { TimeSpan start_time = DateTime.Now.TimeOfDay; long n_loops = 50000; long n_primes = 0; for (long i = 0; i &< n_loops; i++) { if (isPrime(i)) { n_primes++; } } TimeSpan end_time = DateTime.Now.TimeOfDay - start_time; Console.WriteLine(n_primes + " primes found"); Console.WriteLine("Time taken = " + end_time.TotalSeconds); Console.WriteLine("LoopCount = " + LoopCount); } } }


首先,Youtube這種網站肯定不是全部用Python寫的。從他們的Github來看,似乎很多工具已經轉到Golang上了:

https://github.com/youtube

Douban的近況不是特別了解。

高性能,主要還是通過profiling和合理的系統設計來達到的,合理區分不同模塊的功能,然後使用正確的工具去解決,比如一些地方使用非同步,一些地方需要用celery之類的工具繞過GIL。沒有一籃子解決方案。


性能不夠 增加硬體,程序員出活的時間成本比機器成本貴多了


python 在數據挖掘方面也很常用,三星之前開源的一個庫主要就是Python寫的:VELES


我看了下3.6有很多性能優化的地方,估計以後Python也可能會向著性能優化發展。

順便其他答案都說了,找到性能差的地方就用C改寫,不過我看到很多Python程序員最後都去寫了Golang


推薦閱讀:

Webpack2 提取共同的 css 文件的最佳實踐?以及 Webpack 的適用場景有哪些?
php7 更新後對於 python 會造成怎樣的衝擊?python+c 擴展能否 hold 住性能?
前端工程師需要對 Linux 掌握到什麼程度?
作為一名前端開發人員,有哪些值得一讀的js代碼?
Python 能取代 PHP 的 Web 開發地位嗎?

TAG:Web開發 | YouTube | 編程語言 | Python | 前端性能優化 |