成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

程序運行慢?你怕是寫的假 Python

開發 后端
Python程序運行太慢的一個可能的原因是沒有盡可能的調用內置方法,下面通過5個例子來演示如何用內置方法提升Python程序的性能。

[[356414]]

Python程序運行太慢的一個可能的原因是沒有盡可能的調用內置方法,下面通過5個例子來演示如何用內置方法提升Python程序的性能。

1. 數組求平方和

輸入一個列表,要求計算出該列表中數字的的平方和。最終性能提升了1.4倍。首先創建一個長度為10000的列表。 

  1. arr = list(range(10000)) 

1.1 最常規的寫法

while循環遍歷列表求平方和。平均運行時間2.97毫秒。 

  1. def sum_sqr_0(arr): 
  2.     res = 0 
  3.     n = len(arr) 
  4.     i = 0 
  5.     while i < n: 
  6.         res += arr[i] ** 2 
  7.         i += 1 
  8.     return res 
  9. %timeit sum_sqr_0(arr) 
  10. 2.97 ms ± 36.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 

1.2 for range代替while循環

避免i += 1的變量類型檢查帶來的額外開銷。平均運行時間2.9毫秒。 

  1. def sum_sqr_1(arr): 
  2.     res = 0 
  3.     for i in range(len(arr)): 
  4.         res += arr[i] ** 2 
  5.     return res 
  6. %timeit sum_sqr_1(arr) 
  7. 2.9 ms ± 137 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 

1.3 for x in arr代替for range

避免arr[i]的變量類型檢查帶來的額外開銷。平均運行時間2.59毫秒。 

  1. def sum_sqr_2(arr): 
  2.     res = 0 
  3.     for x in arr: 
  4.         res += x ** 2 
  5.     return res 
  6. %timeit sum_sqr_2(arr) 
  7. 2.59 ms ± 89 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 

1.4 sum函數套用map函數

平均運行時間2.36毫秒 

  1. def sum_sqr_3(arr): 
  2.     return sum(map(lambda x: x**2, arr)) 
  3. %timeit sum_sqr_3(arr) 
  4. 2.36 ms ± 15.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 

1.5 sum函數套用生成器表達式

生成器表達式如果作為某個函數的參數,則可以省略掉()。平均運行時間2.35毫秒。 

  1. def sum_sqr_4(arr): 
  2.     return sum(x ** 2 for x in arr) 
  3. %timeit sum_sqr_4(arr) 
  4. 2.35 ms ± 107 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 

1. 6 sum函數套用列表推導式

平均運行時間2.06毫秒。 

  1. def sum_sqr_5(arr): 
  2.     return sum([x ** 2 for x in arr]) 
  3. %timeit sum_sqr_5(arr) 
  4. 2.06 ms ± 27.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 

2. 字符串拼接

輸入一個列表,要求將列表中的字符串的前3個字符都拼接為一個字符串。最終性能提升了2.1倍。

首先創建一個列表,生成10000個隨機長度和內容的字符串。 

  1. from random import randint 
  2.  
  3. def random_letter(): 
  4.     return chr(ord('a') + randint(0, 25)) 
  5.  
  6. def random_letters(n): 
  7.     return "".join([random_letter() for _ in range(n)]) 
  8.  
  9. strings = [random_letters(randint(1, 10)) for _ in range(10000)] 

2.1 最常規的寫法

while循環遍歷列表,對字符串進行拼接。平均運行時間1.86毫秒。 

  1. def concat_strings_0(strings): 
  2.     res = "" 
  3.     n = len(strings) 
  4.     i = 0 
  5.     while i < n: 
  6.         res += strings[i][:3] 
  7.         i += 1 
  8.     return res 
  9. %timeit concat_strings_0(strings) 
  10. 1.86 ms ± 74.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

2.2 for range代替while循環

避免i += 1的變量類型檢查帶來的額外開銷。平均運行時間1.55毫秒。 

  1. def concat_strings_1(strings): 
  2.     res = "" 
  3.     for i in range(len(strings)): 
  4.         res += strings[i][:3] 
  5.     return res 
  6. %timeit concat_strings_1(strings) 
  7. 1.55 ms ± 32.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

2.3 for x in strings代替for range

避免strings[i]的變量類型檢查帶來的額外開銷。平均運行時間1.32毫秒。 

  1. def concat_strings_2(strings): 
  2.     res = "" 
  3.     for x in strings: 
  4.         res += x[:3] 
  5.     return res 
  6. %timeit concat_strings_2(strings) 
  7. 1.32 ms ± 19.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

2.4 .join方法套用生成器表達式

平均運行時間1.06毫秒。 

  1. def concat_strings_3(strings): 
  2.     return "".join(x[:3] for x in strings) 
  3. %timeit concat_strings_3(strings) 
  4. 1.06 ms ± 15.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

2.5 .join方法套用列表解析式

平均運行時間0.85毫秒。 

  1. def concat_strings_4(strings): 
  2.     return "".join([x[:3] for x in strings]) 
  3. %timeit concat_strings_4(strings) 
  4. 858 µs ± 14.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

3. 篩選奇數

輸入一個列表,要求篩選出該列表中的所有奇數。最終性能提升了3.6倍。

首先創建一個長度為10000的列表。 

  1. arr = list(range(10000)) 

3.1 最常規的寫法

創建一個空列表res,while循環遍歷列表,將奇數append到res中。平均運行時間1.03毫秒。 

  1. def filter_odd_0(arr): 
  2.     res = [] 
  3.     i = 0 
  4.     n = len(arr) 
  5.     while i < n: 
  6.         if arr[i] % 2: 
  7.             res.append(arr[i]) 
  8.         i += 1 
  9.     return res 
  10. %timeit filter_odd_0(arr) 
  11. 1.03 ms ± 34.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

3.2 for range代替while循環

避免i += 1的變量類型檢查帶來的額外開銷。平均運行時間0.965毫秒。 

  1. def filter_odd_1(arr): 
  2.     res = [] 
  3.     for i in range(len(arr)): 
  4.         if arr[i] % 2: 
  5.             res.append(arr[i]) 
  6.         i += 1 
  7.     return res 
  8. %timeit filter_odd_1(arr) 
  9. 965 µs ± 4.02 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

3.3 for x in arr代替for range

避免arr[i]的變量類型檢查帶來的額外開銷。平均運行時間0.430毫秒。 

  1. def filter_odd_2(arr): 
  2.     res = [] 
  3.     for x in arr: 
  4.         if x % 2: 
  5.             res.append(x) 
  6.     return res 
  7. %timeit filter_odd_2(arr) 
  8. 430 µs ± 9.25 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

3.4 list套用filter函數

平均運行時間0.763毫秒。注意filter函數很慢,在Python 3.6里非常雞肋。 

  1. def filter_odd_3(arr): 
  2.     return list(filter(lambda x: x % 2, arr)) 
  3. %timeit filter_odd_3(arr) 
  4. 763 µs ± 15.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

3.5 list套用生成器表達式

平均運行時間0.398毫秒。 

  1. def filter_odd_4(arr): 
  2.     return list((x for x in arr if x % 2)) 
  3. %timeit filter_odd_4(arr) 
  4. 398 µs ± 16.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

3.6 帶條件的列表推導式

平均運行時間0.290毫秒。 

  1. def filter_odd_5(arr): 
  2.     return [x for x in arr if x % 2] 
  3. %timeit filter_odd_5(arr) 
  4. 290 µs ± 5.54 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

4. 兩個數組相加

輸入兩個長度相同的列表,要求計算出兩個列表對應位置的數字之和,返回一個與輸入長度相同的列表。最終性能提升了2.7倍。

首先生成兩個長度為10000的列表。 

  1. arr1 = list(range(10000))  
  2. arr2 = list(range(10000))  

4.1 最常規的寫法

創建一個空列表res,while循環遍歷列表,將兩個列表對應的元素之和append到res中。平均運行時間1.23毫秒。 

  1. def arr_sum_0(arr1, arr2): 
  2.     i = 0 
  3.     n = len(arr1) 
  4.     res = [] 
  5.     while i < n: 
  6.         res.append(arr1[i] + arr2[i]) 
  7.         i += 1 
  8.     return res 
  9. %timeit arr_sum_0(arr1, arr2) 
  10. 1.23 ms ± 3.77 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

4.2 for range代替while循環

避免i += 1的變量類型檢查帶來的額外開銷。平均運行時間0.997毫秒。 

  1. def arr_sum_1(arr1, arr2): 
  2.     res = [] 
  3.     for i in range(len(arr1)): 
  4.         res.append(arr1[i] + arr2[i]) 
  5.     return res 
  6. %timeit arr_sum_1(arr1, arr2) 
  7. 997 µs ± 7.42 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

4.3 for i, x in enumerate代替for range

部分避免arr[i]的變量類型檢查帶來的額外開銷。平均運行時間0.799毫秒。 

  1. def arr_sum_2(arr1, arr2): 
  2.     res = arr1.copy() 
  3.     for i, x in enumerate(arr2): 
  4.         res[i] += x 
  5.     return res 
  6. %timeit arr_sum_2(arr1, arr2) 
  7. 799 µs ± 16.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

4.4 for x, y in zip代替for range

避免arr[i]的變量類型檢查帶來的額外開銷。平均運行時間0.769毫秒。 

  1. def arr_sum_3(arr1, arr2): 
  2.     res = [] 
  3.     for x, y in zip(arr1, arr2): 
  4.         res.append(x + y) 
  5.     return res 
  6. %timeit arr_sum_3(arr1, arr2) 
  7. 769 µs ± 12.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

4.5 列表推導式套用zip

平均運行時間0.462毫秒。

  1. def arr_sum_4(arr1, arr2): 
  2.     return [x + y for x, y in zip(arr1, arr2)] 
  3. %timeit arr_sum_4(arr1, arr2) 
  4. 462 µs ± 3.43 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

5. 兩個列表相同元素的數量

輸入兩個列表,要求統計兩個列表相同元素的數量。其中每個列表內的元素都是不重復的。最終性能提升了5000倍。

首先創建兩個列表,并將元素的順序打亂。 

  1. from random import shuffle 
  2. arr1 = list(range(2000)) 
  3. shuffle(arr1) 
  4. arr2 = list(range(1000, 3000)) 
  5. shuffle(arr2) 

5.1 最常規的寫法

while循環嵌套,判斷元素arr1[i]是否等于arr2[j],平均運行時間338毫秒。 

  1. def n_common_0(arr1, arr2): 
  2.     res = 0 
  3.     i = 0 
  4.     m = len(arr1) 
  5.     n = len(arr2) 
  6.     while i < m: 
  7.         j = 0 
  8.         while j < n: 
  9.             if arr1[i] == arr2[j]: 
  10.                 res += 1 
  11.             j += 1 
  12.         i += 1 
  13.     return res 
  14. %timeit n_common_0(arr1, arr2) 
  15. 338 ms ± 7.81 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) 

5.2 for range代替while循環

避免i += 1的變量類型檢查帶來的額外開銷。平均運行時間233毫秒。 

  1. def n_common_1(arr1, arr2): 
  2.     res = 0 
  3.     for i in range(len(arr1)): 
  4.         for j in range(len(arr2)): 
  5.             if arr1[i] == arr2[j]: 
  6.                 res += 1 
  7.     return res 
  8. %timeit n_common_1(arr1, arr2) 
  9. 233 ms ± 10.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) 

5.3 for x in arr代替for range

避免arr[i]的變量類型檢查帶來的額外開銷。平均運行時間84.8毫秒。 

  1. def n_common_2(arr1, arr2): 
  2.     res = 0 
  3.     for x in arr1: 
  4.         for y in arr2: 
  5.             if x == y: 
  6.                 res += 1 
  7.     return res 
  8. %timeit n_common_2(arr1, arr2) 
  9. 84.8 ms ± 1.38 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) 

5.4 使用if x in arr2代替內層循環

平均運行時間24.9毫秒。 

  1. def n_common_3(arr1, arr2): 
  2.     res = 0 
  3.     for x in arr1: 
  4.         if x in arr2: 
  5.             res += 1 
  6.     return res 
  7. %timeit n_common_3(arr1, arr2) 
  8. 24.9 ms ± 1.39 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) 

5.4 使用更快的算法

將數組用.sort方法排序,再進行單層循環遍歷。把時間復雜度從O(n2)降低到O(nlogn),平均運行時間0.239毫秒。 

  1. def n_common_4(arr1, arr2): 
  2.     arr1.sort() 
  3.     arr2.sort() 
  4.     res = i = j = 0 
  5.     m, n = len(arr1), len(arr2) 
  6.     while i < m and j < n: 
  7.         if arr1[i] == arr2[j]: 
  8.             res += 1 
  9.             i += 1 
  10.             j += 1 
  11.         elif arr1[i] > arr2[j]: 
  12.             j += 1 
  13.         else
  14.             i += 1 
  15.     return res 
  16. %timeit n_common_4(arr1, arr2) 
  17. 329 µs ± 12.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

5.5 使用更好的數據結構

將數組轉為集合,求交集的長度。平均運行時間0.067毫秒。 

  1. def n_common_5(arr1, arr2): 
  2.     return len(set(arr1) & set(arr2)) 
  3. %timeit n_common_5(arr1, arr2) 
  4. 67.2 µs ± 755 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) 

 【責任編輯:龐桂玉 TEL:(010)68476606】

責任編輯:龐桂玉 來源: Python中文社區(ID:python-china)
相關推薦

2021-06-07 10:00:41

MD5算法加密

2022-08-15 18:31:18

PythonGUI

2018-08-02 16:17:34

Python 開發編程語言

2023-09-28 22:14:50

Python編寫假值

2019-03-10 08:02:28

WiFiAP信息泄露

2009-10-22 11:03:20

OSGi Web應用程

2018-10-28 15:40:23

Python編程語言

2022-09-06 16:40:59

AI真假AI換臉

2020-04-03 14:55:39

Python 代碼編程

2017-02-10 16:39:47

戴爾商用電腦促銷

2024-04-18 09:51:36

Python數據開發

2020-04-02 18:30:28

PythonGitHub編程語言

2020-04-02 16:02:44

PythonGithub博客

2019-11-26 09:45:27

軟件設計設計模式

2010-02-22 15:06:05

Python解釋程序

2018-12-14 15:51:47

Pandas數據數據結構

2021-03-09 11:09:10

LinuxWindows應用程序

2023-04-10 18:03:18

Rust編程語言

2011-05-12 11:01:26

HTML

2021-03-28 16:55:11

Python工具鏈代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 爽爽免费视频 | 国产午夜精品久久久久免费视高清 | 精品日韩一区 | 国产一级电影在线观看 | 欧美成人一区二区 | 国产激情一区二区三区 | 国产精品免费看 | 成人久久18免费网站 | 国产玖玖 | 福利一区在线观看 | 亚洲欧美另类在线观看 | 81精品国产乱码久久久久久 | 国产亚洲精品精品国产亚洲综合 | 久久大香 | 成年女人免费v片 | 日本不卡一二三 | www.欧美视频| 龙珠z在线观看 | 亚洲欧美激情网 | 精品国产一区二区在线 | 亚洲欧美一区二区三区在线 | 国产探花在线观看视频 | 成人av片在线观看 | 亚洲第一天堂 | 九色视频网站 | 精品国产乱码久久久久久闺蜜 | 中文字幕日韩欧美一区二区三区 | 日韩精品视频在线观看一区二区三区 | 久久小视频 | 久久男人天堂 | 中文字幕免费观看 | 国产精品久久久久久久久久久久 | 午夜精品久久久久久久久久久久久 | 搞av.com | 久久男人 | 国产精品一区视频 | 国产精品日日摸夜夜添夜夜av | 天堂久久av | 91精品成人久久 | 黄网站色大毛片 | 久久久久久电影 |