這10個Python性能調(diào)優(yōu)的小技巧,你知道幾個?

這是我的第479篇原創(chuàng),這篇文章關(guān)于Python性能調(diào)優(yōu)的10個小技巧,每天花5-10分鐘閱讀我的文章,對你技術(shù)提升一定會有幫助。
1 多多使用列表生成式
替換下面代碼:
cube_numbers?=?[]
??for?n?in?range(0,10):
????if?n?%?2?==?1:
??????cube_numbers.append(n**3)
為列表生成式寫法:
cube_numbers?=?[n**3?for?n?in?range(1,10)?if?n%2?==?1]
2 內(nèi)置函數(shù)
盡可能多使用下面這些內(nèi)置函數(shù):

3 盡可能使用生成器
單機處理較大數(shù)據(jù)量時,生成器往往很有用,因為它是分小片逐次讀取,最大程度節(jié)省內(nèi)存,如下網(wǎng)頁爬取時使用yield
import?requests
import?re
def?get_pages(link):
??pages_to_visit?=?[]
??pages_to_visit.append(link)
??pattern?=?re.compile('https?')
??while?pages_to_visit:
????current_page?=?pages_to_visit.pop(0)
????page?=?requests.get(current_page)
????for?url?in?re.findall('',?str(page.content)):
??????if?url[0]?==?'/':
????????url?=?current_page?+?url[1:]
??????if?pattern.match(url):
????????pages_to_visit.append(url)
????#?yield
????yield?current_page
webpage?=?get_pages('http://www.example.com')
for?result?in?webpage:
??print(result)
4 判斷成員所屬關(guān)系最快的方法使用 in
for?name?in?member_list:
??print('{}?is?a?member'.format(name))
5 使用集合求交集
替換下面代碼:
a?=?[1,2,3,4,5]
b?=?[2,3,4,5,6]
overlaps?=?[]
for?x?in?a:
??for?y?in?b:
????if?x==y:
??????overlaps.append(x)
print(overlaps)
修改為set和求交集:
a?=?[1,2,3,4,5]
b?=?[2,3,4,5,6]
overlaps?=?set(a)?&?set(b)
print(overlaps)
6 多重賦值
Python支持多重賦值的風格,要多多使用
first_name,?last_name,?city?=?"Kevin",?"Cunningham",?"Brighton"
7 盡量少用全局變量
Python查找最快、效率最高的是局部變量,查找全局變量相對變慢很多,因此多用局部變量,少用全局變量。
8 高效的itertools模塊
itertools模塊支持多個迭代器的操作,提供最節(jié)省內(nèi)存的寫法,因此要多多使用,如下求三個元素的全排列:
import?itertools
iter?=?itertools.permutations(["Alice",?"Bob",?"Carol"])
list(iter)
9 lru_cache 緩存
位于functools模塊的lru_cache裝飾器提供了緩存功能,如下結(jié)合它和遞歸求解斐波那契數(shù)列第n:
import?functools
@functools.lru_cache(maxsize=128)
def?fibonacci(n):
??if?n?==?0:
????return?0
??elif?n?==?1:
????return?1
??return?fibonacci(n?-?1)?+?fibonacci(n-2)
因此,下面的遞歸寫法非常低效,存在重復求解多個子問題的情況:
def fibonacci(n):
if n == 0: # There is no 0'th number
return 0
elif n == 1: # We define the first number as 1
return 1
return fibonacci(n - 1) + fibonacci(n-2)
10 內(nèi)置函數(shù)、key和itemgetter
上面提到盡量多使用內(nèi)置函數(shù),如下對列表排序使用key,operator.itemgetter:
import?operator
my_list?=?[("Josh",?"Grobin",?"Singer"),?("Marco",?"Polo",?"General"),?("Ada",?"Lovelace",?"Scientist")]
my_list.sort(key=operator.itemgetter(0))
my_listzhenguo原創(chuàng)精華PDF,傾情奉獻給你,后臺回復對應關(guān)鍵詞下載,給文章點個贊:
Python專題?|?數(shù)據(jù)分析手冊?|?算法刷題100
關(guān)注我,從零學Python
評論
圖片
表情
