日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python写算法太慢_程序运行慢?你怕是写的假 Python

發布時間:2024/9/30 python 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python写算法太慢_程序运行慢?你怕是写的假 Python 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

1. 數組求平方和

輸入一個列表,要求計算出該列表中數字的的平方和。最終性能提升了1.4倍。

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

arr?=?list(range(10000))

1.1 最常規的寫法

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

def?sum_sqr_0(arr):

res?=?0

n?=?len(arr)

i?=?0

while?i?

res?+=?arr[i]?**?2

i?+=?1

return?res

%timeit?sum_sqr_0(arr)

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毫秒。

def?sum_sqr_1(arr):

res?=?0

for?i?in?range(len(arr)):

res?+=?arr[i]?**?2

return?res

%timeit?sum_sqr_1(arr)

2.9?ms?±?137?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?100?loops?each)

1.3for x in arr代替for range

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

def?sum_sqr_2(arr):

res?=?0

for?x?in?arr:

res?+=?x?**?2

return?res

%timeit?sum_sqr_2(arr)

2.59?ms?±?89?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?100?loops?each)

1.4 sum函數套用map函數

平均運行時間2.36毫秒

def?sum_sqr_3(arr):

return?sum(map(lambda?x:?x**2,?arr))

%timeit?sum_sqr_3(arr)

2.36?ms?±?15.1?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?100?loops?each)

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

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

def?sum_sqr_4(arr):

return?sum(x?**?2?for?x?in?arr)

%timeit?sum_sqr_4(arr)

2.35?ms?±?107?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?100?loops?each)

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

平均運行時間2.06毫秒。

def?sum_sqr_5(arr):

return?sum([x?**?2?for?x?in?arr])

%timeit?sum_sqr_5(arr)

2.06?ms?±?27.2?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?100?loops?each)

2. 字符串拼接

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

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

from?random?import?randint

def?random_letter():

return?chr(ord('a')?+?randint(0,?25))

def?random_letters(n):

return?"".join([random_letter()?for?_?in?range(n)])

strings?=?[random_letters(randint(1,?10))?for?_?in?range(10000)]

2.1 最常規的寫法

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

def?concat_strings_0(strings):

res?=?""

n?=?len(strings)

i?=?0

while?i?

res?+=?strings[i][:3]

i?+=?1

return?res

%timeit?concat_strings_0(strings)

1.86?ms?±?74.9?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?1000?loops?each)

2.2for range代替while循環

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

def?concat_strings_1(strings):

res?=?""

for?i?in?range(len(strings)):

res?+=?strings[i][:3]

return?res

%timeit?concat_strings_1(strings)

1.55?ms?±?32.9?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?1000?loops?each)

2.3for x in strings代替for range

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

def?concat_strings_2(strings):

res?=?""

for?x?in?strings:

res?+=?x[:3]

return?res

%timeit?concat_strings_2(strings)

1.32?ms?±?19.5?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?1000?loops?each)

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

平均運行時間1.06毫秒。

def?concat_strings_3(strings):

return?"".join(x[:3]?for?x?in?strings)

%timeit?concat_strings_3(strings)

1.06?ms?±?15.2?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?1000?loops?each)

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

平均運行時間0.85毫秒。

def?concat_strings_4(strings):

return?"".join([x[:3]?for?x?in?strings])

%timeit?concat_strings_4(strings)

858?μs?±?14.5?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?1000?loops?each)

3. 篩選奇數

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

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

arr?=?list(range(10000))

3.1 最常規的寫法

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

def?filter_odd_0(arr):

res?=?[]

i?=?0

n?=?len(arr)

while?i?

if?arr[i]?%?2:

res.append(arr[i])

i?+=?1

return?res

%timeit?filter_odd_0(arr)

1.03?ms?±?34.1?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?1000?loops?each)

3.2for range代替while循環

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

def?filter_odd_1(arr):

res?=?[]

for?i?in?range(len(arr)):

if?arr[i]?%?2:

res.append(arr[i])

i?+=?1

return?res

%timeit?filter_odd_1(arr)

965?μs?±?4.02?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?1000?loops?each)

3.3for x in arr代替for range

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

def?filter_odd_2(arr):

res?=?[]

for?x?in?arr:

if?x?%?2:

res.append(x)

return?res

%timeit?filter_odd_2(arr)

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里非常雞肋。

def?filter_odd_3(arr):

return?list(filter(lambda?x:?x?%?2,?arr))

%timeit?filter_odd_3(arr)

763?μs?±?15.9?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?1000?loops?each)

3.5 list套用生成器表達式

平均運行時間0.398毫秒。

def?filter_odd_4(arr):

return?list((x?for?x?in?arr?if?x?%?2))

%timeit?filter_odd_4(arr)

398?μs?±?16.4?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?1000?loops?each)

3.6 帶條件的列表推導式

平均運行時間0.290毫秒。

def?filter_odd_5(arr):

return?[x?for?x?in?arr?if?x?%?2]

%timeit?filter_odd_5(arr)

290?μs?±?5.54?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?1000?loops?each)

4. 兩個數組相加

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

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

arr1?=?list(range(10000))

arr2?=?list(range(10000))

4.1 最常規的寫法

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

def?arr_sum_0(arr1,?arr2):

i?=?0

n?=?len(arr1)

res?=?[]

while?i?

res.append(arr1[i]?+?arr2[i])

i?+=?1

return?res

%timeit?arr_sum_0(arr1,?arr2)

1.23?ms?±?3.77?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?1000?loops?each)

4.2for range代替while循環

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

def?arr_sum_1(arr1,?arr2):

res?=?[]

for?i?in?range(len(arr1)):

res.append(arr1[i]?+?arr2[i])

return?res

%timeit?arr_sum_1(arr1,?arr2)

997?μs?±?7.42?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?1000?loops?each)

4.3for i, x in enumerate代替for range

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

def?arr_sum_2(arr1,?arr2):

res?=?arr1.copy()

for?i,?x?in?enumerate(arr2):

res[i]?+=?x

return?res

%timeit?arr_sum_2(arr1,?arr2)

799?μs?±?16.7?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?1000?loops?each)

4.4for x, y in zip代替for range

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

def?arr_sum_3(arr1,?arr2):

res?=?[]

for?x,?y?in?zip(arr1,?arr2):

res.append(x?+?y)

return?res

%timeit?arr_sum_3(arr1,?arr2)

769?μs?±?12.2?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?1000?loops?each)

4.5 列表推導式套用zip

平均運行時間0.462毫秒。

def?arr_sum_4(arr1,?arr2):

return?[x?+?y?for?x,?y?in?zip(arr1,?arr2)]

%timeit?arr_sum_4(arr1,?arr2)

462?μs?±?3.43?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?1000?loops?each)

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

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

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

from?random?import?shuffle

arr1?=?list(range(2000))

shuffle(arr1)

arr2?=?list(range(1000,?3000))

shuffle(arr2)

5.1 最常規的寫法

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

def?n_common_0(arr1,?arr2):

res?=?0

i?=?0

m?=?len(arr1)

n?=?len(arr2)

while?i?

j?=?0

while?j?

if?arr1[i]?==?arr2[j]:

res?+=?1

j?+=?1

i?+=?1

return?res

%timeit?n_common_0(arr1,?arr2)

338?ms?±?7.81?ms?per?loop?(mean?±?std.?dev.?of?7?runs,?1?loop?each)

5.2for range代替while循環

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

def?n_common_1(arr1,?arr2):

res?=?0

for?i?in?range(len(arr1)):

for?j?in?range(len(arr2)):

if?arr1[i]?==?arr2[j]:

res?+=?1

return?res

%timeit?n_common_1(arr1,?arr2)

233?ms?±?10.9?ms?per?loop?(mean?±?std.?dev.?of?7?runs,?1?loop?each)

5.3for x in arr代替for range

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

def?n_common_2(arr1,?arr2):

res?=?0

for?x?in?arr1:

for?y?in?arr2:

if?x?==?y:

res?+=?1

return?res

%timeit?n_common_2(arr1,?arr2)

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毫秒。

def?n_common_3(arr1,?arr2):

res?=?0

for?x?in?arr1:

if?x?in?arr2:

res?+=?1

return?res

%timeit?n_common_3(arr1,?arr2)

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毫秒。

def?n_common_4(arr1,?arr2):

arr1.sort()

arr2.sort()

res?=?i?=?j?=?0

m,?n?=?len(arr1),?len(arr2)

while?i?

if?arr1[i]?==?arr2[j]:

res?+=?1

i?+=?1

j?+=?1

elif?arr1[i]?>?arr2[j]:

j?+=?1

else:

i?+=?1

return?res

%timeit?n_common_4(arr1,?arr2)

329?μs?±?12.3?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?1000?loops?each)

5.5 使用更好的數據結構

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

def?n_common_5(arr1,?arr2):

return?len(set(arr1)?&?set(arr2))

%timeit?n_common_5(arr1,?arr2)

67.2?μs?±?755?ns?per?loop?(mean?±?std.?dev.?of?7?runs,?10000?loops?each)

總結

以上是生活随笔為你收集整理的python写算法太慢_程序运行慢?你怕是写的假 Python的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久精品国产亚洲av蜜臀色欲 | 中文字幕123区| 男女猛烈无遮挡 | 精品久操 | 久久国产人妻一区二区免色戒电影 | 久久露脸国语精品国产 | 成人一级毛片 | 免费一级黄色片 | www男人天堂 | 国产在线日韩 | 青青伊人精品 | 欧美性猛交xxxx黑人猛交 | 手机亚洲第一页 | 日韩三级a| 四虎影视免费永久大全 | 久久久久久久偷拍 | 日本波多野结衣在线 | 亚洲高清毛片一区二区 | 青青草免费在线 | 久久精品www人人爽人人 | 红桃视频国产精品 | 日韩一区二区视频在线观看 | 久操视频在线免费观看 | 97人人模人人爽人人少妇 | 亚洲日本中文字幕 | 人妻换人妻a片爽麻豆 | 欧美在线视频网 | 后入内射无码人妻一区 | 亚洲欧美专区 | 亚洲欧美成人一区二区 | 三上悠亚在线播放 | 国产精选视频在线观看 | 色婷婷av一区二区三区gif | 麻豆av毛片 | 天天射狠狠干 | 亚洲欧美中日韩 | 色噜噜狠狠一区二区三区果冻 | 51精产品一区一区三区 | 亚洲熟妇中文字幕五十中出 | 免费中文视频 | 精品视频一区二区三区四区 | 无码精品人妻一区二区三区漫画 | 在线观看欧美亚洲 | av在线大全 | 黑人一级视频 | 国产成人精品国内自产拍免费看 | 五月天激情婷婷 | 国内精品久久久久久 | 91l九色lporny| 亚洲欧洲成人精品久久一码二码 | 四虎影视大全 | 欧美中文字幕在线播放 | www.午夜激情 | 亚洲另类欧美日韩 | 久久久久人妻精品色欧美 | 欧美专区在线播放 | 国产成人 综合 亚洲 | 国产精品成人久久久久 | 欧美不卡一区二区三区 | 久久久久影视 | 法国空姐在线观看免费 | 欧美在线aa | 日韩中文字幕一区二区三区四区 | 中文字幕无码日韩专区免费 | 亚洲国产精品视频 | 国产一级在线观看视频 | 老女人做爰全过程免费的视频 | 国产精品一级视频 | 中国爆后菊女人的视频 | 一级肉体全黄毛片 | 欧美情爱视频 | 欧美一区二区三区在线免费观看 | 大牛影视剧免费播放在线 | 一级视频毛片 | 日日艹 | 成人四色 | 青青伊人国产 | 色婷婷激情五月 | 国产精品海角社区 | 青青在线| 91成人精品一区在线播放 | 在线观看高清视频 | 久久精品成人av | 韩国三级bd高清中字2021 | 亚洲一级在线 | 夜夜导航 | 潘金莲一级淫片aaaaa武则天 | 高清在线一区二区 | 强行糟蹋人妻hd中文 | 亚洲先锋影音 | 欧美成人h版在线观看 | 天天曰天天干 | 伊人一级 | 九九九九色 | 成年人的黄色片 | 国产人成精品 | 1024av在线 | 黄网站在线观看视频 | 青草伊人网 |