當前位置:首頁 » 編程語言 » python的執行效率

python的執行效率

發布時間: 2022-07-27 06:46:32

A. python為啥運行效率不高

原因:1、python是動態語言;2、python是解釋執行,但是不支持JIT;3、python中一切都是對象,每個對象都需要維護引用計數,增加了額外的工作。4、python GIL;5、垃圾回收。

當我們提到一門編程語言的效率時:通常有兩層意思,第一是開發效率,這是對程序員而言,完成編碼所需要的時間;另一個是運行效率,這是對計算機而言,完成計算任務所需要的時間。編碼效率和運行效率往往是魚與熊掌的關系,是很難同時兼顧的。不同的語言會有不同的側重,python語言毫無疑問更在乎編碼效率,life is short,we use python。

雖然使用python的編程人員都應該接受其運行效率低的事實,但python在越多越來的領域都有廣泛應用,比如科學計算 、web伺服器等。程序員當然也希望python能夠運算得更快,希望python可以更強大。

首先,python相比其他語言具體有多慢,這個不同場景和測試用例,結果肯定是不一樣的。這個網址給出了不同語言在各種case下的性能對比,這一頁是python3和C++的對比,下面是兩個case:

從上圖可以看出,不同的case,python比C++慢了幾倍到幾十倍。

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%。感興趣的讀者可以去細讀。

推薦課程:Python機器學習(Mooc禮欣、嵩天教授)

B. Python 的開發效率真的比 java高嗎

Java
java常常跟"企業"聯系在一起, 因為具備一些很好的語言特性, 以及豐富的框架, 在企業應用中最被青睞, 你總可以聽到關於J2EE, JSP, Hibernate之類的東西的討論. 同時, java在手機領域也有一席之地, 在普遍智能化之前, 很多手機就是以支持java應用作為賣點的, 而智能手機爆發之後, java手機主場變成了android, 作為安卓的標准編程語言而存在.
Python
Python由於具有豐富和強大的庫,它又叫做作膠水語言,能夠把用其他語言製作的各種模塊(尤其是C/C++)很輕松地聯結在一起。常見的一種應用情形是,使用Python快速生成程序的原型(有時甚至是程序的最終界面),然後對其中有特別要求的部分,用更合適的語言改寫,比如3D游戲中的圖形渲染模塊,性能要求特別高,就可以用C/C++重寫,而後封裝為Python可以調用的擴展類庫。Python是做伺服器開發與物聯網開發。信息安全,大數據處理,數據可視化機器學習,物聯網開發,各大軟體的api,桌面應用,都需要python。
只有哪個開發效率更高,看你在哪些地方去運用

C. python的效率怎麼樣

運行效率慢,但開發效率快
如果演算法固定——就是一次開發就足夠了,而不斷處理不同的大量數據,建議還是C#等
如果演算法不固定,例如每次得到一批數據就要根據需要寫相應公式去處理的話,python在寫代碼省下的時間應該優於c#編譯後運行的時間
當然,如果你的數據即使c/c++也要花數小時才能運算得到結果的(天文數字),那就另當別論了
python數據分析請搜索numpy+scipy相關內容,它們就是專門為了科學計算而設計的模塊

D. 如何提高Python運行效率 超實用的四種提速

Python含有許多古老的排序規則,這些規則在你創建定製的排序方法時會佔用很多時間,而這些排序方法運行時也會拖延程序實際的運行速度。最佳的排序方法其實是盡可能多地使用鍵和內置的sort()方法。

E. Python運行效率低的原因有哪些

1.Python是動態語言

動態語言是一類在運行時可以改變其結構的語言,如新的函數、對象、代碼可以被引入,已有的函數可以被刪除或其他結構上的變化等,該類語言更具有活性,但是不可避免的因為運行時的不確定性也影響運行效率。

2.Python是解釋執行

相比於C語言編譯性語言編寫的程序,Python是解釋執行語言,其運行過程是Python運行文件程序時,Python解釋器將源代碼轉換為位元組碼,然後再由Python解釋器來執行這些位元組碼。其每次運行都要進行轉換成位元組碼,然後再由虛擬機把位元組碼轉換成機器語言,最後才能在硬體上運行,與編譯性語言相比,其過程更復雜,性能肯定會受影響。

3.Python中一切都是對象

Python是一門面向對象的編程語言,其設計理念是一切皆是對象,如數字、字元串、元組、列表、字典、函數、方法、類、模塊等都是對象,包括代碼,每個對象都需要維護引用計數,因此,增加了額外工作,影響了性能。

4.Python GIL

GIL是Python最為詬病的一點,因為GIL,Python中的多線程並不能真正的並發,即使在單線程,GIL也會帶來很大的性能影響,因為python每執行100個opcode就會嘗試線程的切換,因此,影響Python運行效率。

5.垃圾回收

Python採用標記和分代的垃圾回收策略,每次垃圾回收的時候都會中斷正在執行的程序,造成所謂的頓卡,影響運行效率。

F. python運行效率低嗎

其實還好吧。現在電腦這么強大。在python裡面運行大數量循環,最好用xrange()。你可以試試看xrange(100000)就知道什麼叫效率了。Python里建一個100000個元素的列表要不了一秒,效率不算低。

G. 如何提高python的運行效率

竅門一:關鍵代碼使用外部功能包

Python簡化了許多編程任務,但是對於一些時間敏感的任務,它的表現經常不盡人意。使用C/C++或機器語言的外部功能包處理時間敏感任務,可以有效提高應用的運行效率。這些功能包往往依附於特定的平台,因此你要根據自己所用的平台選擇合適的功能包。簡而言之,這個竅門要你犧牲應用的可移植性以換取只有通過對底層主機的直接編程才能獲得的運行效率。以下是一些你可以選擇用來提升效率的功能包:

Cython
Pylnlne
PyPy
Pyrex

這些功能包的用處各有不同。比如說,使用C語言的數據類型,可以使涉及內存操作的任務更高效或者更直觀。Pyrex就能幫助Python延展出這樣的功能。Pylnline能使你在Python應用中直接使用C代碼。內聯代碼是獨立編譯的,但是它把所有編譯文件都保存在某處,並能充分利用C語言提供的高效率。

竅門二:在排序時使用鍵

Python含有許多古老的排序規則,這些規則在你創建定製的排序方法時會佔用很多時間,而這些排序方法運行時也會拖延程序實際的運行速度。最佳的排序方法其實是盡可能多地使用鍵和內置的sort()方法。譬如,拿下面的代碼來說:

import operator
somelist = [(1, 5,]
在每段例子里,list都是根據你選擇的用作關鍵參數的索引進行排序的。這個方法不僅對數值類型有效,還同樣適用於字元串類型。

竅門三:針對循環的優化

每一種編程語言都強調最優化的循環方案。當使用Python時,你可以藉助豐富的技巧讓循環程序跑得更快。然而,開發者們經常遺忘的一個技巧是:盡量避免在循環中訪問變數的屬性。譬如,拿下面的代碼來說:

lowerlist = ['this', 'is', 'lowercase']
upper = str.upper
upperlist = []
append = upperlist.append
for word in lowerlist:
append(upper(word))
print(upperlist)
#Output = ['THIS', 'IS', 'LOWERCASE']
每次你調用str.upper, Python都會計算這個式子的值。然而,如果你把這個求值賦值給一個變數,那麼求值的結果就能提前知道,Python程序就能運行得更快。因此,關鍵就是盡可能減小Python在循環中的工作量。因為Python解釋執行的特性,在上面的例子中會大大減慢它的速度。

(注意:優化循環的方法還有很多,這只是其中之一。比如,很多程序員會認為,列表推導式是提高循環速度的最佳方法。關鍵在於,優化循環方案是提高應用程序運行速度的上佳選擇。)

竅門四:使用較新的Python版本

如果你在網上搜索Python,你會發現數不盡的信息都是關於如何升級Python版本。通常,每個版本的Python都會包含優化內容,使其運行速度優於之前的版本。但是,限制因素在於,你最喜歡的函數庫有沒有同步更新支持新的Python版本。與其爭論函數庫是否應該更新,關鍵在於新的Python版本是否足夠高效來支持這一更新。

你要保證自己的代碼在新版本里還能運行。你需要使用新的函數庫才能體驗新的Python版本,然後你需要在做出關鍵性的改動時檢查自己的應用。只有當你完成必要的修正之後,你才能體會新版本的不同。

然而,如果你只是確保自己的應用在新版本中可以運行,你很可能會錯過新版本提供的新特性。一旦你決定更新,請分析你的應用在新版本下的表現,並檢查可能出問題的部分,然後優先針對這些部分應用新版本的特性。只有這樣,用戶才能在更新之初就覺察到應用性能的改觀。

竅門五:嘗試多種編碼方法

每次創建應用時都使用同一種編碼方法幾乎無一例外會導致應用的運行效率不盡人意。可以在程序分析時嘗試一些試驗性的辦法。譬如說,在處理字典中的數據項時,你既可以使用安全的方法,先確保數據項已經存在再進行更新,也可以直接對數據項進行更新,把不存在的數據項作為特例分開處理。請看下面第一段代碼:

n = 16
myDict = {}
for i in range(0, n):
char = 'abcd'[i%4]
if char not in myDict:
myDict[char] = 0
myDict[char] += 1
print(myDict)
當一開始myDict為空時,這段代碼會跑得比較快。然而,通常情況下,myDict填滿了數據,至少填有大部分數據,這時換另一種方法會更有效率。

n = 16
myDict = {}
for i in range(0, n):
char = 'abcd'[i%4]
try:
myDict[char] += 1
except KeyError:
myDict[char] = 1
print(myDict)
在兩種方法中輸出結果都是一樣的。區別在於輸出是如何獲得的。跳出常規的思維模式,創建新的編程技巧能使你的應用更有效率。

竅門六:交叉編譯你的應用

開發者有時會忘記計算機其實並不理解用來創建現代應用程序的編程語言。計算機理解的是機器語言。為了運行你的應用,你藉助一個應用將你所編的人類可讀的代碼轉換成機器可讀的代碼。有時,你用一種諸如Python這樣的語言編寫應用,再以C++這樣的語言運行你的應用,這在運行的角度來說,是可行的。關鍵在於,你想你的應用完成什麼事情,而你的主機系統能提供什麼樣的資源。

Nuitka是一款有趣的交叉編譯器,能將你的Python代碼轉化成C++代碼。這樣,你就可以在native模式下執行自己的應用,而無需依賴於解釋器程序。你會發現自己的應用運行效率有了較大的提高,但是這會因平台和任務的差異而有所不同。

(注意:Nuitka現在還處在測試階段,所以在實際應用中請多加註意。實際上,當下最好還是把它用於實驗。此外,關於交叉編譯是否為提高運行效率的最佳方法還存在討論的空間。開發者已經使用交叉編譯多年,用來提高應用的速度。記住,每一種解決辦法都有利有弊,在把它用於生產環境之前請仔細權衡。)

在使用交叉編譯器時,記得確保它支持你所用的Python版本。Nuitka支持Python2.6, 2.7, 3.2和3.3。為了讓解決方案生效,你需要一個Python解釋器和一個C++編譯器。Nuitka支持許多C++編譯器,其中包括Microsoft Visual Studio,MinGW 和 Clang/LLVM。

交叉編譯可能造成一些嚴重問題。比如,在使用Nuitka時,你會發現即便是一個小程序也會消耗巨大的驅動空間。因為Nuitka藉助一系列的動態鏈接庫(DDLs)來執行Python的功能。因此,如果你用的是一個資源很有限的系統,這種方法或許不太可行。

H. python效率

Python的優勢有哪些?
① 開發效率高,Python具有非常強大的第三方庫,在此基礎上進行開發,很大程度上提高開發效率
② 面向對象,python的編程思想更符合人類的思維邏輯,不需要像C語言那樣去理解計算機的運行思維
③ 免費、開源,可以自由閱讀源代碼並進行改動,實現想要的功能,並且網路上有已經很多Python的學習資源
④ 可移植性,可以在很多平台上無縫連接,包括 Linux 、Windows、FreeBSD、Solaris 等等
⑤ 可擴展性,如果想讓一段代碼運行的更快,可以選擇C語言或者C++來編寫,然後在Python中直接使用
⑥ 簡單易學,相對於java等,語法更簡單,更易上手,適用於編程初學者

I. 提高python執行效率的方法

針對於解決運行效率這個問題,由於Python是一種膠水語言,自然可以將需要高效運行的代碼塊使用C或Java改寫之後嵌入。這是目前解決執行效率最有效的方法。

Python

J. python和shell有什麼區別

1、Python不需要記憶太多的命令,語法簡單,有C基礎的人學起來非常容易上手,易於使用;而shell要學的命令有很多,但常用的命令不是很多。
2、Python可移植性好,它的標準是統一的,不會出現因為平台的不同運行結果不同,但shell的命令在各個平台上有些不一樣。
3、Python更加強大,shell是一種命令語言,同時也可以看成是一個命令解釋器,用於接收諸如awk、sed的命令調用等完成相關的功能。而Python則是一種編程語言,Python提供給程序員更大的自由度和靈活性,以完成shell所不能完成或者難於完成的編碼任務,如實現面向對象的模塊化設計、操作伺服器資料庫等。
4、Python支持面向對象、支持可擴展性和可嵌入性,同時提供了功能豐富的庫。
5、性能方面,很明顯地,Python的執行效率要高於shell,有一個很充分的理由就是shell本身的各種進程間IPC通信要造成相當大的開銷;而Python底層是C語言實現的,其性能可以接近於C,但具體相同功能的Python代碼量卻要比C短很多倍,因此Python的性能高於shell。

熱點內容
甘肅隴南dns伺服器地址雲主機 發布:2025-03-05 00:43:52 瀏覽:384
一頓壓縮機 發布:2025-03-05 00:41:51 瀏覽:407
php二維數組拆分 發布:2025-03-05 00:33:24 瀏覽:198
游猴腳本 發布:2025-03-05 00:33:20 瀏覽:516
微信存儲的文檔 發布:2025-03-05 00:31:42 瀏覽:230
c語言中基本的數據類型包括 發布:2025-03-05 00:30:55 瀏覽:709
安卓小組件哪個好用 發布:2025-03-05 00:30:20 瀏覽:341
安卓如何下載錄屏精靈 發布:2025-03-05 00:15:22 瀏覽:486
攻城掠地怎麼開伺服器 發布:2025-03-05 00:11:31 瀏覽:483
怎麼看漢蘭達什麼配置 發布:2025-03-05 00:08:29 瀏覽:283