最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

盤點(diǎn)提高 Python 代碼效率的方法

 更新時間:2014年07月03日 09:26:29   投稿:hebedich  
本人用 Python 快兩年了,平時只是用它來寫點(diǎn)小小的分析腳本,以方便快捷為主,也沒怎么考慮代碼效率問題。最近想給自己升升級,提高一下代碼的檔次。于是找了一堆效率相關(guān)的文章,做了些實驗,總結(jié)一下。

第一招:蛇打七寸:定位瓶頸

首先,第一步是定位瓶頸。舉個簡單的栗子,一個函數(shù)可以從1秒優(yōu)化到到0.9秒,另一個函數(shù)可以從1分鐘優(yōu)化到30秒,如果要花的代價相同,而且時間限制只能搞定一個,搞哪個?根據(jù)短板原理,當(dāng)然選第二個啦。

一個有經(jīng)驗的程序員在這里一定會遲疑一下,等等?函數(shù)?這么說,還要考慮調(diào)用次數(shù)?如果第一個函數(shù)在整個程序中需要被調(diào)用100000次,第二個函數(shù)在整個程序中被調(diào)用1次,這個就不一定了。舉這個栗子,是想說明,程序的瓶頸有的時候不一定一眼能看出來。還是上面那個選擇,程序員的你應(yīng)該有感覺的,大多數(shù)情況下:一個「可以」從一分鐘優(yōu)化到30秒的函數(shù)會比一個「可以」從1秒優(yōu)化到0.9秒的函數(shù)更容易捕獲我們的注意,因為有很大的進(jìn)步空間嘛。

所以,這么多廢話講完,獻(xiàn)上第一招,profile。這是 python 自帶的定位程序瓶頸的利器!雖然它提供了三種選項profile,cProfile,hotshot。還分為內(nèi)置和外置。但是,個人覺得一種足矣,外置cProfile。心法如下:

python -m profile 逗比程序.py

這招的效果會輸出一系列東西,比如函數(shù)被調(diào)用了幾次,總時間多少,其中有多少是這個函數(shù)的子函數(shù)花費(fèi)的,每次花多少時間,等等。嘛一圖勝千言:

filename:lineno(function): 文件名:第幾行(函數(shù)名)
ncalls: 這貨一共調(diào)用了幾次
tottime: 這貨自己總共花了多少時間,也就是要除掉內(nèi)部函數(shù)小弟們的花費(fèi)
percall: 平均每次調(diào)用花的時間,tottime 除以 ncalls
cumtime: 這貨還有它的所有內(nèi)部函數(shù)小弟們的總花費(fèi)
percall: 跟上面那個 percall 差不多,不過是 cumtime 除以 ncalls
找到最值得優(yōu)化的點(diǎn),然后干吧。

第二招:一蛇禪:只需一招

記得剛開始接觸 Python 的時候,有一位學(xué)長告訴我,Python 有一個牛逼的理想,它希望每一個用它的人能寫出一模一樣的程序。Python 之禪有云:

There should be one-- and preferably only one --obvious way to do it

所以 Python 系專業(yè)的禪師提供了一些常用功能的 only one 的寫法。本人看了一下傳說中的PythonWiKi:PerformanceTips,總結(jié)了幾個「不要醬紫」「要醬紫」。

合并字符串的時候不要醬紫:

s = "" for substring in list: s += substring

要醬紫:

s = "".join(slist)

格式化字符串的時候不要醬紫:

out = "<html>" + head + prologue + query + tail + "</html>"

要醬紫:

out = "<html>%s%s%s%s</html>" % (head, prologue, query, tail)

可以不用循環(huán)的時候就不要用循環(huán),比如不要醬紫:

newlist = [] for word in oldlist: newlist.append(word.upper())

要醬紫:

newlist = map(str.upper, oldlist)

或者醬紫:

newlist = [s.upper() for s in oldlist]

字典初始化,比較常用的:

wdict = {} for word in words: if word not in wdict: wdict[word] = 0 wdict[word] += 1

如果重復(fù)的 word 太多了的話,可以考慮用醬紫的模式來省掉大量判斷:

wdict = {} for word in words: try: wdict[word] += 1 except KeyError: wdict[word] = 1

盡量減少 function 調(diào)用次數(shù),用內(nèi)部循環(huán)代替,比如,不要醬紫:

x = 0 def doit1(i): global x x = x + i list = range(100000) t = time.time() for i in list: doit1(i)

要醬紫:

x = 0 def doit2(list): global x for i in list: x = x + i list = range(100000) t = time.time() doit2(list)

第三招:蛇之狙擊:高速搜索

這一招部分來源于IBM:Python 代碼性能優(yōu)化技巧,搜索算法的最高境界是O(1)的算法復(fù)雜度。也就是 Hash Table。本人幸本科的時候?qū)W了點(diǎn)數(shù)據(jù)結(jié)構(gòu)。知道 Python 的 list 使用類似鏈表的方法實現(xiàn)的。如過列表很大的話,在茫茫多的項里面用 if X in list_a 來做搜索和判斷效率是非常低的。

Python 的 tuple 我用得非常少,不評論。另兩個我用得非常多的是 set 和 dict。這兩個就是用的類似 Hash Table 的實現(xiàn)方法。

所以盡量不要醬紫:

k = [10,20,30,40,50,60,70,80,90] for i in xrange(10000): if i in k: #Do something continue

要醬紫:

``` k = [10,20,30,40,50,60,70,80,90] k_dict = {i:0 for i in k}

先把 list 轉(zhuǎn)換成 dictionary

for i in xrange(10000): if i in k_dict: #Do something continue ```

找 list 的交集,不要醬紫:

list_a = [1,2,3,4,5]
list_b = [4,5,6,7,8]
list_common = [a for a in list_a if a in list_b]

要醬紫:

list_a = [1,2,3,4,5]
list_b = [4,5,6,7,8]
list_common = set(list_a)&set(list_b)

第四招:小蛇蛇……:想不出來名字了,就是各種小 Tips

變量交換不需要中間變量:a,b = b,a (這里有個神坑,至今記憶深刻:True,False = False,True)
如果使用 Python2.x,用 xrange 代替 range,如果用 Python3.x,range 已經(jīng)是 xrange 了,xrange 已經(jīng)木有了。xrange 不會像 range 一樣生成一個列表,而是生成一個迭代器,省內(nèi)存。
可以用 x>y>z 代替 x>y and y>z。效率更高,可讀性也更好。當(dāng)然理論上 x>y
add(x,y) 一般會比 a+b 要快?這個本人有所懷疑,實驗了一下,首先 add 不能直接用,要 import operator,第二,我的實驗結(jié)果表示 add(x,y) 完全沒有 a+b 快,更何況還要犧牲可讀性。
while 1 確實比 while True 要快那么一點(diǎn)點(diǎn)。做了兩次實驗,大概快了15%左右。
第五招:無蛇勝有蛇:代碼之外的性能

代碼之外嘛,除了硬件之外,就是編譯器了,這里隆重推薦 pypy。pypy是一種叫做 just-in-time 的即時編譯器。這個編譯器的特點(diǎn)就是編譯一句跑一句,和靜態(tài)的編譯器的區(qū)別嘛,我在知乎上看到一個非常形象的比喻:

假定你是一個導(dǎo)演,靜態(tài)編譯就是讓演員把整個劇本背下來吃透,然后連續(xù)表演一個小時。動態(tài)編譯就是讓演員表演兩分鐘,然后思考一下,再看一下劇本,再表演兩分鐘……

動態(tài)編譯和靜態(tài)編譯各有所長,看你演的是電影還是話劇了。

此外還有一個 Cython 可以在 python 里內(nèi)置一些 C 的代碼。我用的非常少,但是關(guān)鍵時刻確實有效。

相關(guān)文章

  • Python操作數(shù)據(jù)庫之?dāng)?shù)據(jù)庫編程接口

    Python操作數(shù)據(jù)庫之?dāng)?shù)據(jù)庫編程接口

    這篇文章主要介紹了Python操作數(shù)據(jù)庫之?dāng)?shù)據(jù)庫編程接口,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-06-06
  • Python 使用 Redis 作為緩存的操作方法

    Python 使用 Redis 作為緩存的操作方法

    在現(xiàn)代Web應(yīng)用和數(shù)據(jù)密集型服務(wù)中,使用Redis作為緩存可以提升性能和響應(yīng)速度,Redis是一個高性能的內(nèi)存中數(shù)據(jù)結(jié)構(gòu)存儲系統(tǒng),支持多種數(shù)據(jù)結(jié)構(gòu)如字符串、哈希、列表等,并提供持久性和分布式支持,本文給大家介紹Python 使用 Redis 作為緩存的操作方法,感興趣的朋友一起看看吧
    2024-10-10
  • Python中BeautifulSoup通過查找Id獲取元素信息

    Python中BeautifulSoup通過查找Id獲取元素信息

    這篇文章主要介紹了Python中BeautifulSoup通過查找Id獲取元素信息,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Python使用Tkinter實現(xiàn)滾動抽獎器效果

    Python使用Tkinter實現(xiàn)滾動抽獎器效果

    Tkinter 是 Python 的標(biāo)準(zhǔn) GUI(Graphical User Interface,圖形用戶接口)庫,Python 使用 Tkinter 可以快速地創(chuàng)建 GUI 應(yīng)用程序。這篇文章主要介紹了Python使用Tkinter實現(xiàn)滾動抽獎器,需要的朋友可以參考下
    2020-01-01
  • python獲取本地計算機(jī)名字的方法

    python獲取本地計算機(jī)名字的方法

    這篇文章主要介紹了python獲取本地計算機(jī)名字的方法,涉及Python獲取本地計算機(jī)信息的相關(guān)技巧,非常簡單實用,需要的朋友可以參考下
    2015-04-04
  • pycharm與jupyter?lab/notebook結(jié)合使用方式

    pycharm與jupyter?lab/notebook結(jié)合使用方式

    這篇文章主要介紹了pycharm與jupyter?lab/notebook結(jié)合使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • python自動統(tǒng)計zabbix系統(tǒng)監(jiān)控覆蓋率的示例代碼

    python自動統(tǒng)計zabbix系統(tǒng)監(jiān)控覆蓋率的示例代碼

    這篇文章主要介紹了python自動統(tǒng)計zabbix系統(tǒng)監(jiān)控覆蓋率的示例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Python人工智能實戰(zhàn)之對話機(jī)器人的實現(xiàn)

    Python人工智能實戰(zhàn)之對話機(jī)器人的實現(xiàn)

    本文將通過Python開發(fā)一個可以講笑話的機(jī)器人,可以自由定制功能,想講幾個笑話就講幾個笑話。文中的示例代碼講解詳細(xì),感興趣的可以動手試一試
    2022-02-02
  • 詳談python中冒號與逗號的區(qū)別

    詳談python中冒號與逗號的區(qū)別

    下面小編就為大家分享一篇詳談python中冒號與逗號的區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Python tkinter如何設(shè)置背景顏色

    Python tkinter如何設(shè)置背景顏色

    本文主要介紹了Python的tkinter庫中設(shè)置組件背景顏色的方法,主要通過使用bg選項和config方法來實現(xiàn),包括設(shè)置單個組件、窗口、按鈕、文本框以及整個應(yīng)用的背景顏色,同時也可以使用十六進(jìn)制顏色代碼進(jìn)行更精確的顏色控制
    2024-09-09

最新評論

乌审旗| 诏安县| 台东市| 普安县| 九龙坡区| 故城县| 云阳县| 如东县| 宁远县| 漾濞| 固镇县| 三门县| 田东县| 华坪县| 上栗县| 壤塘县| 平罗县| 新绛县| 城市| 靖州| 霍林郭勒市| 霞浦县| 竹北市| 滦平县| 阳泉市| 五峰| 盈江县| 宜君县| 库尔勒市| 金乡县| 驻马店市| 西充县| 泸水县| 霍州市| 松溪县| 勐海县| 通化县| 绵阳市| 汾西县| 株洲县| 荣昌县|