最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

五個提升Python的執(zhí)行效率的技巧分享

 更新時間:2023年04月11日 08:35:16   作者:Python 集中營  
python作為使用最廣泛的編程語言之一,有著無窮無盡的第三方非標準庫的支持。但python有一個經(jīng)常被人詬病的缺點那就是運行速度,所以本文和大家分享了五個提升Python的執(zhí)行效率的技巧,希望對大家有所幫助

python作為使用最廣泛的編程語言之一,有著無窮無盡的第三方非標準庫的支持。

簡單的語法、優(yōu)雅的代碼塊使其在各個業(yè)務(wù)領(lǐng)域都混的風生水起,除了這些優(yōu)點,python有一個經(jīng)常被人詬病的缺點那就是運行速度。

小伙伴通過下面的五個python開發(fā)技巧,來充分提高python代碼塊的運行速度,并且提供了各個python技巧的使用后的運行時間的統(tǒng)計來佐證。

開始之前小伙伴先可以開發(fā)一個統(tǒng)計函數(shù)運行時間的python裝飾器用于后面我們對各個python技巧使用后的時間統(tǒng)計。

#?導(dǎo)入時間提取的time模塊
from?time?import?time

import?dis


def?compute_time(func_):
????'''
????計算函數(shù)的運行時間
????'''

????def?func_time(*arg,?**kw):
????????t1?=?time()
????????result?=?func_(*arg,?**kw)
????????t2?=?time()
????????print(f"{func_.__name__:?>10}?:?{t2?-?t1:.6f}?秒")
????????return?result

????return?func_time

上述的compute_time時間計算函數(shù)我們開發(fā)好了,可以開發(fā)一個hello_world函數(shù)測試一下使用是否正常。

@compute_time
def?hello_world():
????print("hello_world!")


hello_world()

#?hello_world!
#?hello_world?:?0.000000?秒

通過hello_world函數(shù)的測試,證明我們的時間裝飾器compute_time能夠正常統(tǒng)計出函數(shù)所運行的時間。

接下來,我們開始正式的介紹下面的五種方式來提高python的運行速度并提供時間運行的結(jié)果。

1、合理使用標準或非標準庫

在開發(fā)過程中絕對不能小看python的標準或非標準庫,說實話我們自己有時候?qū)懙耐瑯拥臉I(yè)務(wù)代碼塊確實是沒有大佬們完美。

比如下面這個業(yè)務(wù)我們需要將一個python列表中的值轉(zhuǎn)換成字符串,首先看看下面的代碼塊的寫法。

#?初始化一個list列表
list_?=?['a',?'b',?'c']?*?10000


@compute_time
def?func_1(list_=None):
????'''
????列表元素轉(zhuǎn)字符串函數(shù)
????'''
????str_?=?''
????for?s?in?list_:
????????str_?=?str_?+?s
????return?str_


func_1(list_)


#?func_1?:?0.001999?秒

通過上面的func_1函數(shù)的執(zhí)行情況使用自己寫的傳統(tǒng)的方式來轉(zhuǎn)換步驟比較繁雜,并且花費了0.001999 秒的時間。

@compute_time
def?func_2(list_=None):
????'''
????列表元素轉(zhuǎn)字符串
????'''
????return?''.join(list_)


func_2(list_)

#?func_2?:?0.000000?秒

相比func_1函數(shù)的運行時間,func_2運行的時間幾乎可以忽略不計,六位數(shù)的小數(shù)根本看不出來變化。

2、減少循環(huán)的使用

從平常開發(fā)的過程中其實已經(jīng)發(fā)現(xiàn),使用列表推導(dǎo)式、迭代式等的可序列化數(shù)據(jù)處理方式要比for循環(huán)更加的便捷、高效。

下面我們同樣可以通過一個例子來說明問題,比如我們需要挑選出一個list列表中可以被2整除的數(shù)。

#?初始化循環(huán)次數(shù)n
n?=?100000


@compute_time
def?func_3(n=None):
????list_?=?[]
????for?m?in?range(n):
????????if?m?%?2?==?0:
????????????list_.append(m)
????return?list_


@compute_time
def?func_4(n=None):
????return?[m?for?m?in?range(n)?if?m?%?2?==?0]


func_3(n)

func_4(n)

#?func_3?:?0.004986?秒
#?func_4?:?0.003014?秒

通過func_3函數(shù)、func_4函數(shù)的比較,首先func_4的方式比func_3精簡了許多。

并且時間上func_4使用列表推導(dǎo)式的方式比普通的for循環(huán)運行速度上快了1/4的時間。

3、注意重復(fù)代碼運行

關(guān)于代碼的重復(fù)運行這個在我們通常的開發(fā)方式中都能體會到,也就是本可以作為公共代碼塊運行一次就可以。

可以卻將能夠公共使用的代碼塊加入到了循環(huán)當中,這樣只會影響代碼塊的執(zhí)行效率。

比如我們需要使用python的re模塊去搜索字符串中的某一些元素,下面通過兩種方式來比較時間結(jié)果。

#?導(dǎo)入正則表達式匹配模塊
import?re


@compute_time
def?func_5(str_=None):
????for?s?in?str_:
????????result?=?re.search(r'a*[a-z]?c',?s)


@compute_time
def?func_6(str_=None):
????repx?=?re.compile(r'a*[a-z]?c')
????for?s?in?str_:
????????result?=?repx.search(s)


func_5('abcdefg1234oks'?*?1000)

func_6('abcdefg1234oks'?*?1000)

#?func_5?:?0.006999?秒
#?func_6?:?0.002000?秒

對比func_5和func_6的業(yè)務(wù)實現(xiàn)方式,我們將re模塊的compile正則匹配對象直接放到for循環(huán)的外層,運行時間直接就減少了3倍不止。

是因為在循環(huán)中直接使用search匹配正則對象,會在循環(huán)中不斷地創(chuàng)建正則匹配對象,這樣就
增加了for循環(huán)的處理負擔,導(dǎo)致速度變慢。

4、減少全局變量使用

在說明這一點的時候,我們要明白全局變量在程序運行的過程中是一直存在的不會消失。

全局變量太多就會導(dǎo)致運行期間占用的內(nèi)存太大,相比全局變量使用局部變量就會變得更加的高效。

下面我們通過兩種方式的使用實例,來對比全局變量和局部變量的運行時間。

mes_1?=?'ss1'

mes_2?=?'ss2'

mes_3?=?'ss3'


@compute_time
def?func_7():
????result?=?mes_1?+?mes_2?+?mes_3
????return?result


@compute_time
def?func_8():
????me_1?=?'ss1'
????me_2?=?'ss2'
????me_3?=?'ss3'
????result?=?me_1?+?me_2?+?me_3
????return?result


func_7()

func_8()


#?func_7?:?0.000997?秒
#?func_8?:?0.000000?秒

上面我們做了一個普通的加法計算已經(jīng)說明了問題,func_8函數(shù)使用局部變量的方式確實速度更快。

5、使用合理的數(shù)據(jù)結(jié)構(gòu)

在大多數(shù)的python開發(fā)過程中,想必很多人都是為了方便更多的時候使用的是list列表的方式來處理數(shù)據(jù)。

Python 有四種內(nèi)置的數(shù)據(jù)結(jié)構(gòu):列表、元組、集合、字典,在合適的業(yè)務(wù)場景中使用合適的數(shù)據(jù)結(jié)構(gòu)來處理數(shù)據(jù)同樣能提高計算的執(zhí)行效率。

比如:下面我們將從一個list列表和tuple元組來提取對應(yīng)索引位置上面的值。

@compute_time
def?func_9():
????data?=?['a',?'b',?'c',?'d',?'e',?'f',?'g',?'h']
????print(data[3])


@compute_time
def?func_10():
????data?=?('a',?'b',?'c',?'d',?'e',?'f',?'g',?'h')
????print(data[3])

func_9()

func_10()

#?func_9?:?0.000000?秒
#?func_10?:?0.000000?秒

通過執(zhí)行func_9和func_10函數(shù),我們發(fā)現(xiàn)時間上兩者的差距不大,起碼在六位小數(shù)之內(nèi)是分辨不出結(jié)果的。

print('func_9匯編產(chǎn)生的機器碼:')
dis.dis(func_9)

print('func_10匯編產(chǎn)生的機器碼:')
dis.dis(func_10)

最后,我們分別查看了func_9和func_10的匯編機器碼,發(fā)現(xiàn)明顯list列表處理產(chǎn)生的機器碼更多。

# func_9匯編產(chǎn)生的機器碼:
#??30???????????0?LOAD_GLOBAL??????????????0?(time)
#???????????????2?CALL_FUNCTION????????????0
#???????????????4?STORE_FAST???????????????2?(t1)
#
#??31???????????6?LOAD_DEREF???????????????0?(func_)
#???????????????8?LOAD_FAST????????????????0?(arg)
#??????????????10?LOAD_FAST????????????????1?(kw)
#??????????????12?CALL_FUNCTION_EX?????????1
#??????????????14?STORE_FAST???????????????3?(result)
#
#??32??????????16?LOAD_GLOBAL??????????????0?(time)
#??????????????18?CALL_FUNCTION????????????0
#??????????????20?STORE_FAST???????????????4?(t2)
#
#??33??????????22?LOAD_GLOBAL??????????????1?(print)
#??????????????24?LOAD_DEREF???????????????0?(func_)
#??????????????26?LOAD_ATTR????????????????2?(__name__)
#??????????????28?LOAD_CONST???????????????1?('?>10')
#??????????????30?FORMAT_VALUE?????????????4?(with?format)
#??????????????32?LOAD_CONST???????????????2?('?:?')
#??????????????34?LOAD_FAST????????????????4?(t2)
#??????????????36?LOAD_FAST????????????????2?(t1)
#??????????????38?BINARY_SUBTRACT
#??????????????40?LOAD_CONST???????????????3?('.6f')
#??????????????42?FORMAT_VALUE?????????????4?(with?format)
#??????????????44?LOAD_CONST???????????????4?('?秒')
#??????????????46?BUILD_STRING?????????????4
#??????????????48?CALL_FUNCTION????????????1
#??????????????50?POP_TOP
#
#??34??????????52?LOAD_FAST????????????????3?(result)
#??????????????54?RETURN_VALUE
# func_10匯編產(chǎn)生的機器碼:
#??30???????????0?LOAD_GLOBAL??????????????0?(time)
#???????????????2?CALL_FUNCTION????????????0
#???????????????4?STORE_FAST???????????????2?(t1)
#
#??31???????????6?LOAD_DEREF???????????????0?(func_)
#???????????????8?LOAD_FAST????????????????0?(arg)
#??????????????10?LOAD_FAST????????????????1?(kw)
#??????????????12?CALL_FUNCTION_EX?????????1
#??????????????14?STORE_FAST???????????????3?(result)

到此這篇關(guān)于五個提升Python的執(zhí)行效率的技巧分享的文章就介紹到這了,更多相關(guān)Python提升執(zhí)行效率技巧內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python利用matplotlib繪制圓環(huán)圖(環(huán)形圖)的實戰(zhàn)案例

    Python利用matplotlib繪制圓環(huán)圖(環(huán)形圖)的實戰(zhàn)案例

    環(huán)形圖也被稱為圓環(huán)圖,它在功能上與餅圖相同,只是中間有一個空白,并且能夠同時支持多個統(tǒng)計數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Python利用matplotlib繪制圓環(huán)圖的實戰(zhàn)案例,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • 利用Python寫一場新年煙花秀

    利用Python寫一場新年煙花秀

    這篇文章主要介紹了利用Python寫一場新年煙花秀,可以送給朋友還可以當作練習,Python 模塊包括:tkinter、PIL、time、random、math,下面來看一下代碼實現(xiàn),需要的朋友可以參考一下
    2022-01-01
  • python hash每次調(diào)用結(jié)果不同的原因

    python hash每次調(diào)用結(jié)果不同的原因

    這篇文章主要介紹了python hash每次調(diào)用結(jié)果不同的原因,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Python中的random函數(shù)實例詳解

    Python中的random函數(shù)實例詳解

    random模塊提供生成偽隨機數(shù)的函數(shù),在使用時需要導(dǎo)入random模塊,這篇文章主要介紹了Python中的random函數(shù),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • Python圖像運算之圖像銳化和邊緣檢測

    Python圖像運算之圖像銳化和邊緣檢測

    這篇文章主要和大家講解一下常見的圖像銳化和邊緣檢測方法,即Roberts算子和Prewitt算子。文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-12-12
  • Python格式化css文件的方法

    Python格式化css文件的方法

    這篇文章主要介紹了Python格式化css文件的方法,實例分析了Python操作文件的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • Python學習之時間包使用教程詳解

    Python學習之時間包使用教程詳解

    本文主要介紹了Python中的內(nèi)置時間包:datetime包?與?time包?,通過學習時間包可以讓我們的開發(fā)過程中對時間進行輕松的處理,快來跟隨小編一起學習一下吧
    2022-03-03
  • 解決Keras自帶數(shù)據(jù)集與預(yù)訓練model下載太慢問題

    解決Keras自帶數(shù)據(jù)集與預(yù)訓練model下載太慢問題

    這篇文章主要介紹了解決Keras自帶數(shù)據(jù)集與預(yù)訓練model下載太慢問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Django安裝配置mysql的方法步驟

    Django安裝配置mysql的方法步驟

    這篇文章主要介紹了Django安裝配置mysql的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • python生成二維矩陣的兩種方法小結(jié)

    python生成二維矩陣的兩種方法小結(jié)

    本文主要介紹了python生成二維矩陣,包含列表生成m行n列的矩陣和numpy生成想要維度的矩陣的兩種方法,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08

最新評論

成安县| 拜城县| 昌都县| 东乌珠穆沁旗| 韶山市| 都安| 卢湾区| 腾冲县| 循化| 梁河县| 公安县| 察隅县| 新疆| 江陵县| 舒城县| 台山市| 盐边县| 嵩明县| 赤水市| 遂溪县| 淮滨县| 乌拉特中旗| 清镇市| 江津市| 西林县| 望奎县| 张掖市| 湘西| 喀喇沁旗| 万全县| 连南| 玉树县| 汤阴县| 黄梅县| 滦平县| 师宗县| 浦江县| 瑞丽市| 鱼台县| 新平| 丁青县|