91在线一级黄片|91视频在线观看18|成人夜间呦呦网站|91资源欧美日韩超碰|久久最新免费精品视频一区二区三区|国产探花视频在线观看|黄片真人免费三级片毛片|国产人无码视频在线|精品成人影视无码三区|久久视频爱久久免费精品

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
程序運(yùn)行慢?你怕是寫(xiě)的假Python

Python程序運(yùn)行太慢的一個(gè)可能的原因是沒(méi)有盡可能的調(diào)用內(nèi)置方法,下面通過(guò)5個(gè)例子來(lái)演示如何用內(nèi)置方法提升Python程序的性能。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、網(wǎng)絡(luò)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、蟠龍網(wǎng)站維護(hù)、網(wǎng)站推廣。

1. 數(shù)組求平方和

輸入一個(gè)列表,要求計(jì)算出該列表中數(shù)字的的平方和。最終性能提升了1.4倍。首先創(chuàng)建一個(gè)長(zhǎng)度為10000的列表。

 
 
 
  1. arr = list(range(10000))

1.1 最常規(guī)的寫(xiě)法

while循環(huán)遍歷列表求平方和。平均運(yùn)行時(shí)間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循環(huán)

避免i += 1的變量類型檢查帶來(lái)的額外開(kāi)銷。平均運(yùn)行時(shí)間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]的變量類型檢查帶來(lái)的額外開(kāi)銷。平均運(yùn)行時(shí)間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函數(shù)套用map函數(shù)

平均運(yùn)行時(shí)間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函數(shù)套用生成器表達(dá)式

生成器表達(dá)式如果作為某個(gè)函數(shù)的參數(shù),則可以省略掉()。平均運(yùn)行時(shí)間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函數(shù)套用列表推導(dǎo)式

平均運(yùn)行時(shí)間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. 字符串拼接

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

首先創(chuàng)建一個(gè)列表,生成10000個(gè)隨機(jī)長(zhǎng)度和內(nèi)容的字符串。

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

2.1 最常規(guī)的寫(xiě)法

while循環(huán)遍歷列表,對(duì)字符串進(jìn)行拼接。平均運(yùn)行時(shí)間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循環(huán)

避免i += 1的變量類型檢查帶來(lái)的額外開(kāi)銷。平均運(yùn)行時(shí)間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]的變量類型檢查帶來(lái)的額外開(kāi)銷。平均運(yùn)行時(shí)間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方法套用生成器表達(dá)式

平均運(yùn)行時(shí)間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方法套用列表解析式

平均運(yùn)行時(shí)間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. 篩選奇數(shù)

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

首先創(chuàng)建一個(gè)長(zhǎng)度為10000的列表。

 
 
 
  1. arr = list(range(10000))

3.1 最常規(guī)的寫(xiě)法

創(chuàng)建一個(gè)空列表res,while循環(huán)遍歷列表,將奇數(shù)append到res中。平均運(yùn)行時(shí)間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循環(huán)

避免i += 1的變量類型檢查帶來(lái)的額外開(kāi)銷。平均運(yùn)行時(shí)間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]的變量類型檢查帶來(lái)的額外開(kāi)銷。平均運(yùn)行時(shí)間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函數(shù)

平均運(yùn)行時(shí)間0.763毫秒。注意filter函數(shù)很慢,在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套用生成器表達(dá)式

平均運(yùn)行時(shí)間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 帶條件的列表推導(dǎo)式

平均運(yùn)行時(shí)間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. 兩個(gè)數(shù)組相加

輸入兩個(gè)長(zhǎng)度相同的列表,要求計(jì)算出兩個(gè)列表對(duì)應(yīng)位置的數(shù)字之和,返回一個(gè)與輸入長(zhǎng)度相同的列表。最終性能提升了2.7倍。

首先生成兩個(gè)長(zhǎng)度為10000的列表。

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

4.1 最常規(guī)的寫(xiě)法

創(chuàng)建一個(gè)空列表res,while循環(huán)遍歷列表,將兩個(gè)列表對(duì)應(yīng)的元素之和append到res中。平均運(yùn)行時(shí)間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循環(huán)

避免i += 1的變量類型檢查帶來(lái)的額外開(kāi)銷。平均運(yùn)行時(shí)間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]的變量類型檢查帶來(lái)的額外開(kāi)銷。平均運(yùn)行時(shí)間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]的變量類型檢查帶來(lái)的額外開(kāi)銷。平均運(yùn)行時(shí)間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 列表推導(dǎo)式套用zip

平均運(yùn)行時(shí)間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. 兩個(gè)列表相同元素的數(shù)量

輸入兩個(gè)列表,要求統(tǒng)計(jì)兩個(gè)列表相同元素的數(shù)量。其中每個(gè)列表內(nèi)的元素都是不重復(fù)的。最終性能提升了5000倍。

首先創(chuàng)建兩個(gè)列表,并將元素的順序打亂。

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

5.1 最常規(guī)的寫(xiě)法

while循環(huán)嵌套,判斷元素arr1[i]是否等于arr2[j],平均運(yùn)行時(shí)間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循環(huán)

避免i += 1的變量類型檢查帶來(lái)的額外開(kāi)銷。平均運(yùn)行時(shí)間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]的變量類型檢查帶來(lái)的額外開(kāi)銷。平均運(yùn)行時(shí)間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代替內(nèi)層循環(huán)

平均運(yùn)行時(shí)間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 使用更快的算法

將數(shù)組用.sort方法排序,再進(jìn)行單層循環(huán)遍歷。把時(shí)間復(fù)雜度從O(n2)降低到O(nlogn),平均運(yùn)行時(shí)間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 使用更好的數(shù)據(jù)結(jié)構(gòu)

將數(shù)組轉(zhuǎn)為集合,求交集的長(zhǎng)度。平均運(yùn)行時(shí)間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)

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


文章題目:程序運(yùn)行慢?你怕是寫(xiě)的假Python
轉(zhuǎn)載注明:http://m.jiaoqi3.com/article/cdccdpo.html