這篇文章給大家分享的是有關(guān)優(yōu)化python效率的方法有哪些的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。
創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比順城網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式順城網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋順城地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。優(yōu)化python的效率的方法:1、優(yōu)化算法時間復(fù)雜度;2、減少冗余數(shù)據(jù);3、合理使用copy與deepcopy;4、使用dict或set查找元素;5、合理使用生成器(generator)和yield。
優(yōu)化方法:
1、優(yōu)化算法時間復(fù)雜度
算法的時間復(fù)雜度對程序的執(zhí)行效率影響大,在Python中可以通過選擇合適的數(shù)據(jù)結(jié)構(gòu)來優(yōu)化時間復(fù)雜度,如list和set查找某一個元素的時間復(fù)雜度分別是O(n)和O(1)。
2、減少冗余數(shù)據(jù)
如用上三角或下三角的方式去保存一個大的對稱矩陣。在0元素占大多數(shù)的矩陣?yán)锸褂孟∈杈仃嚤硎尽?/p>
3、合理使用copy與deepcopy
對于dict和list等數(shù)據(jù)結(jié)構(gòu)的對象,直接賦值使用的是引用的方式。而有些情況下需要復(fù)制整個對象,這時可以使用copy包里的copy和deepcopy,這兩個函數(shù)的不同之處在于后者是遞歸復(fù)制的。效率也不一樣:(以下程序在ipython中運(yùn)行)
import copy a = range(100000) %timeit -n 10 copy.copy(a) # 運(yùn)行10次 copy.copy(a) %timeit -n 10 copy.deepcopy(a) 10 loops, best of 3: 1.55 ms per loop 10 loops, best of 3: 151 ms per loop
timeit后面的-n表示運(yùn)行的次數(shù),后兩行對應(yīng)的是兩個timeit的輸出,下同。由此可見后者慢一個數(shù)量級。
4、使用dict或set查找元素
python dict和set都是使用hash表來實(shí)現(xiàn)(類似c++11標(biāo)準(zhǔn)庫中unordered_map),查找元素的時間復(fù)雜度是O(1)
a = range(1000) s = set(a) d = dict((i,1) for i in a) %timeit -n 10000 100 in d %timeit -n 10000 100 in s 10000 loops, best of 3: 43.5 ns per loop 10000 loops, best of 3: 49.6 ns per loop
dict的效率略高(占用的空間也多一些)。
5、合理使用生成器(generator)和yield
%timeit -n 100 a = (i for i in range(100000)) %timeit -n 100 b = [i for i in range(100000)] 100 loops, best of 3: 1.54 ms per loop 100 loops, best of 3: 4.56 ms per loop
使用()得到的是一個generator對象,所需要的內(nèi)存空間與列表的大小無關(guān),所以效率會高一些。在具體應(yīng)用上,比如set(i for i in range(100000))會比set([i for i in range(100000)])快。
但是對于需要循環(huán)遍歷的情況:
%timeit -n 10 for x in (i for i in range(100000)): pass %timeit -n 10 for x in [i for i in range(100000)]: pass 10 loops, best of 3: 6.51 ms per loop 10 loops, best of 3: 5.54 ms per loop
后者的效率反而更高,但是如果循環(huán)里有break,用generator的好處是顯而易見的。yield也是用于創(chuàng)建generator:
def yield_func(ls): for i in ls: yield i+1 def not_yield_func(ls): return [i+1 for i in ls] ls = range(1000000) %timeit -n 10 for i in yield_func(ls):pass %timeit -n 10 for i in not_yield_func(ls):pass 10 loops, best of 3: 63.8 ms per loop 10 loops, best of 3: 62.9 ms per loop
對于內(nèi)存不是非常大的list,可以直接返回一個list,但是可讀性yield更佳(人個喜好)。
python2.x內(nèi)置generator功能的有xrange函數(shù)、itertools包等。
感謝各位的閱讀!關(guān)于優(yōu)化python效率的方法有哪些就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
分享名稱:優(yōu)化python效率的方法有哪些-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://jinyejixie.com/article48/peiep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)站維護(hù)、網(wǎng)站設(shè)計(jì)公司、企業(yè)網(wǎng)站制作、關(guān)鍵詞優(yōu)化、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容