Python實現(xiàn)提高運行速度的技巧分享
提高Python運行速度(大方向)
現(xiàn)在我們已經(jīng)知曉如何計算Python代碼的運行時間了,接下來就是要想辦法提高Python運行速度。一般要提高Python代碼的運行速度遵循以下幾點:
1.嘗試通過多線程運行
多線程(multithreading),是指從軟件或者硬件上實現(xiàn)多個線程并發(fā)執(zhí)行的技術(shù)。具有多線程能力的計算機因有硬件支持而能夠在同一時間執(zhí)行多于一個線程,進而提升整體處理性能。
在一個程序中,這些獨立運行的程序片段叫作“線程”(Thread),利用它編程的概念就叫作“多線程處理”。利用多線程技術(shù)可以顯著提高某些特定的代碼運行速度。
現(xiàn)在一般普通的計算機硬件都支持多線程技術(shù),如果一個程序任務(wù)可以分解成多線程形式,那么運行速度將會得到極大的提升。
在以后的教程中將會介紹這種技術(shù)。
2.優(yōu)化循環(huán)處理
循環(huán)處理是編寫代碼時經(jīng)常遇到的情況,由于大循環(huán)一般會運行上成千上萬次以上,于是在循環(huán)結(jié)構(gòu)中,每一個小小的代碼片段進行優(yōu)化處理后都將會大大提高代碼的運行速度。
后面將會詳細介紹一些比較實用且常見的優(yōu)化小技巧。
3.使用內(nèi)置模塊、函數(shù)和數(shù)據(jù)類型
Python內(nèi)置的模塊和函數(shù)是在安裝Python時已經(jīng)定義和安裝好的,不僅導(dǎo)入方便,而且運行速度要比個人編寫的代碼快很多。
速度對比_內(nèi)置模塊
from math import factorial
from time import time
from timeit import timeit
def slow(n=100):
if n == 0 or n == 1:
return 1
else:
return n * slow(n - 1)
def fast():
factorial(100)
b1 = time()
timeit(slow, number=10_0000)
e1 = time()
print(f'函數(shù) slow 運行 10 萬次的時間為:{e1 - b1}')
b2 = time()
timeit(fast, number=10_0000)
e2 = time()
print(f'函數(shù) fast 運行 10 萬次的時間為:{e2 - b2}')函數(shù) slow 運行 10 萬次的時間為:1.9230999946594238
函數(shù) fast 運行 10 萬次的時間為:0.1594223976135254
速度對比_內(nèi)置函數(shù)
from mdTools import ftDecTimeIt # 小編自己編寫的一個計時裝飾器
@ftDecTimeIt(100_0000)
def slow():
new_list = []
word_list = ["i", "am", "a", "bad", "boy"]
for word in word_list:
new_list.append(word.capitalize())
@ftDecTimeIt(100_0000)
def fast():
word_list = ["i", "am", "a", "bad", "boy"]
new_list = list(map(str.capitalize, word_list))
slow()
fast()函數(shù) slow 運行 1000000 次的總耗時為:0.9304 秒
函數(shù) fast 運行 1000000 次的總耗時為:0.8292 秒
速度對比_內(nèi)置方法
from mdTools import ftDecTimeIt
@ftDecTimeIt(100_0000)
def slow():
new_list = ""
word_list = ["i", "am", "a", "bad", "boy"]
for word in word_list:
new_list += word.capitalize()
@ftDecTimeIt(100_0000)
def fast():
word_list = ["i", "am", "a", "bad", "boy"]
new_list = ''.join(word_list)
slow()
fast()函數(shù) slow 運行 1000000 次的總耗時為:1.0097 秒
函數(shù) fast 運行 1000000 次的總耗時為:0.2878 秒
4.使用較新的Python版本
Python版本是在不停迭代更新的,每次更新都會包含優(yōu)化內(nèi)容,這其中不但會優(yōu)化內(nèi)置函數(shù)、內(nèi)置方法、更新模塊,增加新的語法、模塊等,還會優(yōu)化運行速度,截止目前,最新的Python11某些方便運行速度相較于舊版本更是提升30%左右。
5.使用lru_cache緩存數(shù)據(jù)
當你可以把需要計算出來的數(shù)據(jù)保存下來的時候,千萬不要重復(fù)的去計算它。如果你有一個經(jīng)常需要使用的函數(shù),而且返回的是可預(yù)測的結(jié)果,最好是能將其緩存到內(nèi)存中。后續(xù)的函數(shù)調(diào)用如果是一樣的,將立即返回結(jié)果。
Python本地庫functools中的裝飾器:@functools.lru_cache,它就能夠緩存函數(shù)最近的調(diào)用,當緩存的值在特定時間內(nèi)保持不變的時候這個非常好用,比如遞歸調(diào)用問題。
速度對比_緩存數(shù)據(jù)
from functools import lru_cache
from time import time
from timeit import timeit
def slow(n=10):
if n == 1:
return 1
if n == 2:
return 2
else:
return slow(n-2) + slow(n-1)
@lru_cache()
def fast(n=10):
if n == 1:
return 1
if n == 2:
return 2
else:
return slow(n - 2) + slow(n - 1)
b1 = time()
timeit(slow, number=10_0000)
e1 = time()
print(f'函數(shù) slow 運行 10 萬次的時間為:{e1 - b1}')
b2 = time()
timeit(fast, number=10_0000)
e2 = time()
print(f'函數(shù) fast 運行 10 萬次的時間為:{e2 - b2}')函數(shù) slow 運行 10 萬次的時間為:1.344538927078247
函數(shù) fast 運行 10 萬次的時間為:0.007016420364379883
6.使用專門的第三方庫
們都知道,專業(yè)的人做專業(yè)的事,因為他們往往比一般人更了解,也更有經(jīng)驗,處理起來也更加得心應(yīng)手。同樣的,在Python編程中,如果有專門的庫,那么處理起來也事半功倍,而且效率也高。
速度對比_numba庫
numba中提供了jit裝飾器,它可以將其裝飾的函數(shù)JIT編譯成機器碼函數(shù),并返回一個可在Python中調(diào)用機器碼的包裝對象。
from mdTools import ftDecTimeIt
from numba import jit
@ftDecTimeIt(1)
def slow(x=1, y=1_0000_0000):
s = 0
for i in range(x, y):
s += i
return s
@ftDecTimeIt(1)
@jit
def fast(x=1, y=1_0000_0000):
s = 0
for i in range(x, y):
s += i
return s
slow()
fast()函數(shù) slow 運行 1 次的總耗時為:5.2450 秒
函數(shù) fast 運行 1 次的總耗時為:0.2750 秒
速度對比_numpy庫
果你要處理非常龐大的數(shù)據(jù),并且希望能高效的對它們進行計算,那么numpy庫是一個非常好的選擇。numpy在一些關(guān)鍵代碼上使用了C來代替,比原生Python更快處理數(shù)組,也能更高效的存儲數(shù)據(jù)。
使用numpy也能更方便也更快的創(chuàng)建出大數(shù)據(jù)。讓我們來看下面的例子:
from mdTools import ftDecTimeIt import numpy as np array = np.random.random(1_0000_0000) @ftDecTimeIt(1) def slow(): sum(array) @ftDecTimeIt(1) def fast(): np.sum(array) slow() fast()
函數(shù) slow 運行 1 次的總耗時為:8.1115 秒
函數(shù) fast 運行 1 次的總耗時為:0.1173 秒
到此這篇關(guān)于Python實現(xiàn)提高運行速度的技巧分享的文章就介紹到這了,更多相關(guān)Python運行速度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python-xpath獲取html文檔的部分內(nèi)容
這篇文章主要介紹了python-xpath獲取html文檔的部分內(nèi)容,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Python中Cryptography庫實現(xiàn)加密解密
Python中Cryptography庫給你的文件加把安全鎖,本文主要介紹了Python中Cryptography庫實現(xiàn)加密解密,具有一定的參考價值,感興趣的可以了解一下2024-02-02
Python機器學(xué)習(xí)之K-Means聚類實現(xiàn)詳解
這篇文章主要為大家詳細介紹了Python機器學(xué)習(xí)之K-Means聚類的實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02
numpy:np.newaxis 實現(xiàn)將行向量轉(zhuǎn)換成列向量
今天小編就為大家分享一篇numpy:np.newaxis 實現(xiàn)將行向量轉(zhuǎn)換成列向量,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11

