python效率怎麼樣 如何優化python的效率

2021-10-16 20:08:31 字數 2200 閱讀 5312

優化python的效率的方法:1、優化演算法時間複雜度;2、減少冗餘資料;3、合理使用copy與deepcopy;4、使用dict或set查詢元素;5、合理使用生成器(generator)和yield。

優化方法:

1、優化演算法時間複雜度

演算法的時間複雜度對程式的執行效率影響最大,在python中可以通過選擇合適的資料結構來優化時間複雜度,如list和set查詢某乙個元素的時間複雜度分別是o(n)和o(1)。

2、減少冗餘資料

如用上三角或下三角的方式去儲存乙個大的對稱矩陣。在0元素佔大多數的矩陣裡使用稀疏矩陣表示。

3、合理使用copy與deepcopy

對於dict和list等資料結構的物件,直接賦值使用的是引用的方式。而有些情況下需要複製整個物件,這時可以使用copy包裡的copy和deepcopy,這兩個函式的不同之處在於後者是遞迴複製的。效率也不一樣:(以下程式在ipython中執行)import copy

a = range(100000)

%timeit -n 10 copy.copy(a) # 執行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表示執行的次數,後兩行對應的是兩個timeit的輸出,下同。由此可見後者慢乙個數量級。

4、使用dict或set查詢元素

python dict和set都是使用hash表來實現(類似c 11標準庫中unordered_map),查詢元素的時間複雜度是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物件,所需要的記憶體空間與列表的大小無關,所以效率會高一些。在具體應用上,比如set(i for i in range(100000))會比set([i for i in range(100000)])快。

但是對於需要迴圈遍歷的情況:%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

後者的效率反而更高,但是如果迴圈裡有break,用generator的好處是顯而易見的。yield也是用於建立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

對於記憶體不是非常大的list,可以直接返回乙個list,但是可讀性yield更佳(人個喜好)。

python2.x內建generator功能的有xrange函式、itertools包等。

遊戲建模行業怎麼樣,前景怎麼樣?零基礎如何入門學習

3d遊戲建模主要分 次世代角色 次世代場景,現在是行業內需求量比較大的崗位。如果真的下定決心從事遊戲美術行業,零基礎的我們都可以學習,我們同學當中就有很多零基礎和跨行業學習的,後來都發展不錯。所以你應該先想清楚自己真的喜歡什麼,在考慮行業前景,畢竟再有前景的行業也有做的不好的人,看起來前景不好的行業...

立方網怎麼樣

立方網號稱自己是中國第一家lbs 也有傳言facebook的時間軸就是抄襲的立方網。照理說,這樣的公司應該朝氣蓬勃 勇於創新的企業。但是就在最近,白雲黃鶴一名學子爆出在立方網的種種不爽,不管真實性怎麼樣,對即將找工作的同學也是一種參考,文章如下 11年畢業,畢業後去了廣州的一家國企裡面,待了大半年的...

怎麼樣定義常量

一 怎麼定義常量?1.自定義常量 必須用函式define 定義 定義完後其值不能再改變了 使用時直接用常量名,不能像變數一樣在前面加 s 2 系統常量 file php程式檔名 line php程式檔案行數 php version 當前解析器的版本號 php os 執行當前php版本的作業系統名稱 ...