Python 代碼性能優化技巧


眾所周知,程序的性能好壞影響着用戶體驗。所以性能是留住用戶很重要的一環。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" 關鍵字。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM