1. 程式人生 > 實用技巧 >Python程式碼優化

Python程式碼優化

摘自https://www.cnblogs.com/duaimili/p/10275728.html

眾所周知,程式的效能好壞影響著使用者體驗。所以效能是留住使用者很重要的一環。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 Truewhile 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" 關鍵字。