python如何高性能編程

本篇文章給大家分享的是有關(guān)python如何高性能編程,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

創(chuàng)新互聯(lián)公司專(zhuān)業(yè)為企業(yè)提供武江網(wǎng)站建設(shè)、武江做網(wǎng)站、武江網(wǎng)站設(shè)計(jì)、武江網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、武江企業(yè)網(wǎng)站模板建站服務(wù),十多年武江做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

閱讀 Zen of Python,在Python解析器中輸入 import this. 一個(gè)犀利的Python新手可能會(huì)注意到"解析"一詞, 認(rèn)為Python不過(guò)是另一門(mén)腳本語(yǔ)言. "它肯定很慢!"

毫無(wú)疑問(wèn)Python程序沒(méi)有編譯型語(yǔ)言高效快速. 甚至Python擁護(hù)者們會(huì)告訴你Python不適合這些領(lǐng)域. 然而,YouTube已用Python服務(wù)于每小時(shí)4千萬(wàn)視頻的請(qǐng)求. 你所要做的就是編寫(xiě)高效的代碼和需要時(shí)使用外部實(shí)現(xiàn)(C/C++)代碼. 這里有一些建議,可以幫助你成為一個(gè)更好的Python開(kāi)發(fā)者:

1、使用內(nèi)建函數(shù):    你可以用Python寫(xiě)出高效的代碼,但很難擊敗內(nèi)建函數(shù). 經(jīng)查證. 他們非??焖?     

2、使用join()連接字符串.      你可以使用 "+" 來(lái)連接字符串. 但由于string在Python中是不可變的,每一個(gè)"+"操作都會(huì)創(chuàng)建一個(gè)新的字符串并復(fù)制舊內(nèi)容. 常見(jiàn)用法是使用Python的數(shù)組模塊單個(gè)的修改字符;當(dāng)完成的時(shí)候,使用 join() 函數(shù)創(chuàng)建最終字符串.

>>> #This is good to glue a large number of strings
>>> for chunk in input():
>>>    my_string.join(chunk)

3. 使用Python多重賦值,交換變量這在Python中即優(yōu)雅又快速:

>>> x, y = y, x

這樣很慢:

>>> temp = x
>>> x = y
>>> y = temp

4. 盡量使用局部變量

Python 檢索局部變量比檢索全局變量快. 這意味著,避免 "global" 關(guān)鍵字.

5. 盡量使用 "in"

     使用 "in" 關(guān)鍵字. 簡(jiǎn)潔而快速.
     >>> for key in sequence:
     >>>     print “found”

6. 使用延遲加載加速

將 "import" 聲明移入函數(shù)中,僅在需要的時(shí)候?qū)? 換句話說(shuō),如果某些模塊不需馬上使用,稍后導(dǎo)入他們. 例如,你不必在一開(kāi)使就導(dǎo)入大量模塊而加速程序啟動(dòng). 該技術(shù)不能提高整體性能. 但它可以幫助你更均衡的分配模塊的加載時(shí)間.

7. 為無(wú)限循環(huán)使用 "while 1"

有時(shí)候在程序中你需一個(gè)無(wú)限循環(huán).(例如一個(gè)監(jiān)聽(tīng)套接字的實(shí)例) 盡管 "while true" 能完成同樣的事, 但 "while 1" 是單步運(yùn)算. 這招能提高你的Python性能.

     >>> while 1:
     >>>    #do stuff, faster with while 1
     >>> while True:
     >>>    # do stuff, slower with wile True

8. 使用list comprehension

從Python 2.0 開(kāi)始,你可以使用 list comprehension 取代大量的 "for" 和 "while" 塊. 使用List comprehension通常更快,Python解析器能在循環(huán)中發(fā)現(xiàn)它是一個(gè)可預(yù)測(cè)的模式而被優(yōu)化.額外好處是,list comprehension更具可讀性(函數(shù)式編程),并在大多數(shù)情況下,它可以節(jié)省一個(gè)額外的計(jì)數(shù)變量。例如,讓我們計(jì)算1到10之間的偶數(shù)個(gè)數(shù):

     >>> # the good way to iterate a range
     >>> evens = [ i for i in range(10) if i%2 == 0]
     >>> [0, 2, 4, 6, 8]
     >>> # the following is not so Pythonic
     >>> i = 0
     >>> evens = []
     >>> while i < 10:
     >>>    if i %2 == 0: evens.append(i)
     >>>    i += 1
     >>> [0, 2, 4, 6, 8]

9. 使用xrange()處理長(zhǎng)序列:

這樣可為你節(jié)省大量的系統(tǒng)內(nèi)存,因?yàn)閤range()在序列中每次調(diào)用只產(chǎn)生一個(gè)整數(shù)元素。而相反 range(),它將直接給你一個(gè)完整的元素列表,用于循環(huán)時(shí)會(huì)有不必要的開(kāi)銷(xiāo)。

10. 使用 Python generator:

     這也可以節(jié)省內(nèi)存和提高性能。例如一個(gè)視頻流,你可以一個(gè)一個(gè)字節(jié)塊的發(fā)送,而不是整個(gè)流。例如,      
     >>> chunk = ( 1000 * i for i in xrange(1000))
     >>> chunk
     <generator object at 0x7f65d90dcaa0>
     >>> chunk.next()
     0
     >>> chunk.next()
     1000
     >>> chunk.next()
     2000

11. 了解itertools模塊:

     該模塊對(duì)迭代和組合是非常有效的。讓我們生成一個(gè)列表[1,2,3]的所有排列組合,僅需三行Python代碼:
     >>> import itertools
     >>> iter = itertools.permutations([1,2,3])
     >>> list(iter)
     [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

12. 學(xué)習(xí)bisect模塊保持列表排序:

這是一個(gè)免費(fèi)的二分查找實(shí)現(xiàn)和快速插入有序序列的工具。也就是說(shuō),你可以使用:

     >>> import bisect
     >>> bisect.insort(list, element)

你已將一個(gè)元素插入列表中, 而你不需要再次調(diào)用 sort() 來(lái)保持容器的排序, 因?yàn)檫@在長(zhǎng)序列中這會(huì)非常昂貴.

13. 理解Python列表,實(shí)際上是一個(gè)數(shù)組:

Python中的列表實(shí)現(xiàn)并不是以人們通常談?wù)摰挠?jì)算機(jī)科學(xué)中的普通單鏈表實(shí)現(xiàn)的。Python中的列表是一個(gè)數(shù)組。也就是說(shuō),你可以以常量時(shí)間O(1) 檢索列表的某個(gè)元素,而不需要從頭開(kāi)始搜索。這有什么意義呢? Python開(kāi)發(fā)人員使用列表對(duì)象insert()時(shí), 需三思. 例如:>>> list.insert(0,item)

在列表的前面插入一個(gè)元素效率不高, 因?yàn)榱斜碇械乃泻罄m(xù)下標(biāo)不得不改變. 然而,您可以使用list.append()在列表的尾端有效添加元素. 挑先deque,如果你想快速的在兩插入或時(shí)。它是快速的,因?yàn)樵赑ython中的deque用雙鏈表實(shí)現(xiàn)。不再多說(shuō)。  

14. 使用dict 和 set 測(cè)試成員:      檢查一個(gè)元素是在dicitonary或set是否存在 這在Python中非??斓?。這是因?yàn)閐ict和set使用哈希表來(lái)實(shí)現(xiàn)。查找效率可以達(dá)到O(1)。因此,如果您需要經(jīng)常檢查成員,使用 set 或 dict做為你的容器.

     >>> mylist = ['a', 'b', 'c'] #Slower, check membership with list:
     >>> ‘c’ in mylist
     >>> True
     >>> myset = set(['a', 'b', 'c']) # Faster, check membership with set:
     >>> ‘c’ in myset:
     >>> True

15. 使用Schwartzian Transform 的 sort():

原生的list.sort()函數(shù)是非??斓?。 Python會(huì)按自然順序排序列表。有時(shí),你需要非自然順序的排序。例如,你要根據(jù)服務(wù)器位置排序的IP地址。 Python支持自定義的比較,你可以使用list.sort(CMP()),這會(huì)比list.sort()慢,因?yàn)樵黾恿撕瘮?shù)調(diào)用的開(kāi)銷(xiāo)。如果性能有問(wèn) 題,你可以申請(qǐng)Guttman-Rosler Transform,基于Schwartzian Transform. 它只對(duì)實(shí)際的要用的算法有興趣,它的簡(jiǎn)要工作原理是,你可以變換列表,并調(diào)用Python內(nèi)置list.sort() - > 更快,而無(wú)需使用list.sort(CMP() )->慢。

16. Python裝飾器緩存結(jié)果:

  “@”符號(hào)是Python的裝飾語(yǔ)法。它不只用于追查,鎖或日志。你可以裝飾一個(gè)Python函數(shù),記住調(diào)用結(jié)果供后續(xù)使用。這種技術(shù)被稱(chēng)為memoization的。下面是一個(gè)例子:

     >>> from functools import wraps
     >>> def memo(f):
     >>>    cache = { }
     >>>    @wraps(f)
     >>>    def  wrap(*arg):
     >>>        if arg not in cache: cache['arg'] = f(*arg)
     >>>        return cache['arg']
     >>>    return wrap

我們也可以對(duì) Fibonacci 函數(shù)使用裝飾器:

     >>> @memo
     >>> def fib(i):
     >>>    if i < 2: return 1
     >>>    return fib(i-1) + fib(i-2)

這里的關(guān)鍵思想是:增強(qiáng)函數(shù)(裝飾)函數(shù),記住每個(gè)已經(jīng)計(jì)算的Fibonacci值;如果它們?cè)诰彺嬷?就不需要再計(jì)算了.

17. 理解Python的GIL(全局解釋器鎖):

GIL是必要的,因?yàn)镃Python的內(nèi)存管理是非線程安全的。你不能簡(jiǎn)單地創(chuàng)建多個(gè)線程,并希望Python能在多核心的機(jī)器上運(yùn)行得更快。這是因?yàn)?GIL將會(huì)防止多個(gè)原生線程同時(shí)執(zhí)行Python字節(jié)碼。換句話說(shuō),GIL將序列化您的所有線程。然而,您可以使用線程管理多個(gè)派生進(jìn)程加速程序,這些程 序獨(dú)立的運(yùn)行于你的Python代碼外。

18. 像熟悉文檔一樣的熟悉Python源代碼:

Python有些模塊為了性能使用C實(shí)現(xiàn)。當(dāng)性能至關(guān)重要而官方文檔不足時(shí),可以自由探索源代碼。你可以找到底層的數(shù)據(jù)結(jié)構(gòu)和算法。 Python的源碼庫(kù)就是一個(gè)很棒的地方:http://svn.python.org/view/python/trunk/Modules

結(jié)論:

這些不能替代大腦思考. 打開(kāi)引擎蓋充分了解是開(kāi)發(fā)者的職責(zé),使得他們不會(huì)快速拼湊出一個(gè)垃圾設(shè)計(jì). 本文的Python建議可以幫助你獲得好的性能. 如果速度還不夠快, Python將需要借助外力:分析和運(yùn)行外部代碼.我們將在本文的第二部分中涉及.  

以上就是python如何高性能編程,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁(yè)標(biāo)題:python如何高性能編程
當(dāng)前路徑:http://muchs.cn/article42/pipsec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、云服務(wù)器標(biāo)簽優(yōu)化、電子商務(wù)、網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)