眾所周知,程序的性能好壞影響着用戶體驗。所以性能是留住用戶很重要的一環。Python 語言雖然能做很多事情,但是有一個不足之處,那就是執行效率和性能不夠理想。
因此,更有必要進行一定的代碼優化來提高 Python 程序的執行效率。本文章主要是輸出自己在 Python 程序優化的經驗。
01盡量使用內置函數
Python 的標准庫中有很多內置函數,它們的運行效率都很高。因為很多標准庫是使用 C 語言編寫的。Pyhton 的內置函數有:
02拼接字符串
運算符 "+" 不僅能用於加法運算,還能做字符串連接。但是這種效率不是很高。在 Python 中,字符串變量在內存中是不可變的。如果使用 "+" 拼接字符串,內存會先創建一個新字符串,然后將兩個舊字符串拼接,再復制到新字符串。推薦使用以下方法:
-
使用 "%" 運算符連接
這種方式有點像 C 語言中 printf 函數的功能,使用 "%s" 來表示字符串類型參數,再用 "%" 連接一個字符串和一組變量。
1 fir = 'hello' 2 sec = 'monkey' 3 result = '%s, %s' % (fir, sec) 4 print(result)
-
使用 format() 格式化連接
這種格式化字符串函數是 Python 特有的,屬於高級用法。因為它威力強大,不僅支持多種參數類型,還支持對數字格式化。
1 fir = 'hello' 2 sec = 'monkey' 3 result = '{}, {}'.format(fir, sec) 4 print(result)
上述代碼使用隱式的位置參數,format() 還能顯式指定參數所對應變量的位置。
1 fir = 'hello' 2 sec = 'monkey' 3 result = '{1}, {0}'.format(fir, sec) 4 print(result)
-
使用 join() 方式
這種算是技巧性辦法。join() 方法通常是用於連接列表或元組中的元素。
1 list = ['1', '2', '3'] 2 result = '+'.join(list) 3 print(result)
03使用 generator
generator 翻譯成中文是生成器。生成器也是一種特殊迭代器。它其實是生成器函數返回生成器的迭代。生成器算是 Python 非常棒的特性。它的出現能幫助大大節省些內存空間。
假如我們要生成從 1 到 10 這 10 個數字,采用列表的方式定義,會占用 10 個地址空間。采用生成器,只會占用一個地址空間。因為生成器並沒有把所有的值存在內存中,而是在運行時生成值。所以生成器只能訪問一次。
1 # 創建一個從包含 1 到 10 的生成器 2 gen = (i for i in range(10)) 3 print(gen) 4 for i in gen: 5 print(i)
04死循環
雖然使用While True
和while 1
都能實現死循環,但是while 1
是單步運算,所以效率會高一點。
1 # 推薦 2 while 1: 3 # todo list 4 5 while True: 6 # todo list
05巧用多重賦值
交換將兩個變量的值,我們會立馬想到應用一個第三方變量的方法。
1 # 將 a 和 b 兩個值互換 2 temp = a 3 a = b 4 b = temp
Python 素有優雅的名聲,所以有一個更加優雅又快速的方法,那就是多重賦值。
1 # 將 a 和 b 兩個值互換 2 a, b = b, a
06列表的插入與排序
Python 標准庫中有個 bisect 模塊是內置模塊,它實現了一個算法用於插入元素到有序列表。在一些情況下,這比反復排序列表或構造一個大的列表再排序的效率更高。
1 import bisect 2 3 L = [1,3,3,6,8,12,15] 4 x = 3 5 6 x_insert_point = bisect.bisect_left(L, x) 7 # 在 L 中查找 x,x 存在時返回 x 左側的位置,x 不存在返回應該插入的位置 8 # 這是3存在於列表中,返回左側位置1 9 print(x_insert_point) 10 11 x_insert_point = bisect.bisect_right(L, x) 12 # 在 L 中查找 x,x 存在時返回x右側的位置,x 不存在返回應該插入的位置 13 # 這是3存在於列表中,返回右側位置3 14 print(x_insert_point) 15 16 x_insort_left = bisect.insort_left(L, x) 17 #將 x 插入到列表 L 中,x 存在時插入在左側 18 print(L) 19 20 x_insort_rigth = bisect.insort_right(L, x) 21 #將 x 插入到列表L中,x 存在時插入在右側 22 print(L)
07盡量使用局部變量
Python 檢索局部變量比檢索全局變量快。因此, 盡量少用 "global" 關鍵字。