Python中數(shù)值比較的效率
Python數(shù)值比較的效率
Python 數(shù)值比較運(yùn)算效率:>,<,==,!=,>=和<=
python數(shù)值比較運(yùn)算有6種,分別為>,<,==,!=,>=和 <=。他們的運(yùn)算效率如何?采用哪種方式最高效?本文通過使用timeit來測試比較運(yùn)算的效率。
程序如下:
import timeit def func1(): for i in range(100000): if i > 0: k = 2 def func2(): for i in range(100000): if i < 0: k = 2 def func3(): for i in range(100000): if i == 0: k = 2 def func4(): for i in range(100000): if i != 0: k = 2 def func5(): for i in range(100000): if i >= 0: k = 2 def func6(): for i in range(100000): if i <= 0: k = 2 if __name__ == '__main__': func1() func=[func1,func2,func3,func4,func5,func6] op = [">","<","==","!=",">=","<="] for j in range(6): v = 0 timer = timeit.Timer(func[j]) v+= timer.timeit(number=1000) print(op[j],":",v)
這是只有if語句的情況,結(jié)果如下:
比較運(yùn)算 | 所用時(shí)間 |
---|---|
> | 3.2038074 |
< | 2.7034741 |
== | 2.6940471000000006 |
!= | 3.285996800000001 |
>= | 3.205210300000001 |
<= | 2.6961838999999994 |
加上else語句則:
比較運(yùn)算 | 所用時(shí)間 |
---|---|
> | 3.2270024 |
< | 3.2400326 |
== | 3.2511219999999996 |
!= | 3.1877201999999993 |
>= | 3.2120345000000015 |
<= | 3.2339978999999985 |
一般情況下,第一個(gè)分支比較節(jié)省時(shí)間。第二個(gè)分支會(huì)耗時(shí)稍微多一些。
不同python實(shí)現(xiàn)的效率比較
1.取出內(nèi)層容器的多個(gè)值
如果要從嵌套的列表中獲取內(nèi)層列表每個(gè)索引對應(yīng)的最大(或最小值),有兩種方法:
import time import random a = [[random.randint(0, 1000) for i in range(10)] for j in range(100000)] def method_x(a): ?? ?"""每個(gè)索引位置一個(gè)生成器表達(dá)式""" ? ? begin = time.time() ? ? b = min(i[0] for i in a) ? ? c = min(i[1] for i in a) ? ? d = min(i[2] for i in a) ? ? e = min(i[3] for i in a) ? ? f = min(i[4] for i in a) ? ? g = min(i[5] for i in a) ? ? h = min(i[6] for i in a) ? ? i = min(i[7] for i in a) ? ? j = min(i[8] for i in a) ? ? k = min(i[9] for i in a) ? ? print(time.time()-begin) def method_y(a): ?? ?"""只循環(huán)一次算出各個(gè)索引對應(yīng)的值""" ? ? begin = time.time() ? ? b,c,d,e,f,g,h,i,j,k = 100,100,100,100,100,100,100,100,100,100 ? ? for t in a: ? ? ? ? b = min(t[0], b) ? ? ? ? c = min(t[1], c) ? ? ? ? d = min(t[2], d) ? ? ? ? e = min(t[3], e) ? ? ? ? f = min(t[4], f) ? ? ? ? g = min(t[5], g) ? ? ? ? h = min(t[6], h) ? ? ? ? i = min(t[7], i) ? ? ? ? j = min(t[8], j) ? ? ? ? k = min(t[9], k) ? ? print(time.time()-begin)
結(jié)果
>>> method_x(a*10)
1.1728243827819824
>>> method_y(a*10)
2.1234960556030273
2.字符串去掉結(jié)尾(開頭)字符
去除字符串結(jié)尾字符,批量操作的話,一般使用 rstrip() 函數(shù),但是這個(gè)函數(shù)效率不如直接索引快。
import random import time # a為10萬個(gè)長度是11位的字符串列表;b為10萬長度為9位的字符串列表; a = [f'{random.randint(10,100)}xxxyyyzzz' for i in range(100000)] b = [f'{random.randint(100000,110000)}xyz' for i in range(100000)] def test1(a, str_cut):?? ?# replace ? ? b = time.time() ? ? c = [i.replace(str_cut, '') for i in a] ? ? print(time.time()-b) def test2(a, str_cut):?? ?# rstrip() ? ? b = time.time() ? ? c = [i.rstrip(str_cut) for i in a] ? ? print(time.time()-b) def test3(a, str_cut):?? ?# 索引 ? ? b = time.time() ? ? x =len(str_cut) ? ? c = [i[:-x] for i in a] ? ? print(time.time()-b)
結(jié)果比較,當(dāng)想去掉字符長度大于保留的長度的時(shí)候,rstrip() 效率趨近于 replace() , 想去掉的字符長度小于保留部分時(shí),rstrip() 趨近于直接索引。
>>> test1(a*10, 'xxxyyyzzz')
0.2882061004638672
>>> test2(a*10, 'xxxyyyzzz')
0.2662053108215332
>>> test3(a*10, 'xxxyyyzzz')
0.16613411903381348>>> test1(b*10, 'xyz')
0.2721879482269287
>>> test2(b*10, 'xyz')
0.1911303997039795
>>> test3(b*10, 'xyz')
0.1501011848449707
3. in 操作要用集合
按一樣的邏輯寫了兩版程序,運(yùn)行時(shí)間確差了好多,一步一步找,發(fā)現(xiàn)是 in 判斷后面用的容器類型不一樣。
a = range(0, 100000) b = list(a) c = set(a) def test(a): ? ? t = time.time() ? ? c = 0 ? ? for i in range(0, 100000, 13): ? ? ? ? if i in a: ? ? ? ? ? ? c += 1 ? ? print(c) ? ? print(time.time()-t)
測試時(shí)間,差距極大:
>>> test(b)
7693
5.649996280670166
>>> test(a)
7693
0.0019681453704833984
每次判斷之前把列表轉(zhuǎn)換為集合,能改進(jìn)運(yùn)行的效率:
def test(a): ? ? t = time.time() ? ? c = 0 ? ? a = set(a) ? ? for i in range(0, 100000, 13): ? ? ? ? if i in a: ? ? ? ? ? ? c += 1 ? ? print(c) ? ? print(time.time()-t) >>> test(b) 7693 0.005988359451293945
4. 內(nèi)置的max()效率低
def getmax(a, b): ?? ?if a >= b: ?? ??? ?return a ?? ?return b
定義一個(gè)求最大值的函數(shù),再用random模塊提前創(chuàng)造一個(gè)長度100的data_list用于測試(random本身耗時(shí)高,會(huì)讓比較效果不明顯)。
def main(): ? ? t = time.time() ? ? for a, b in data_list*10000: ? ? ? ? max(a, b) ? ? print(time.time()-t) def main2(): ? ? t = time.time() ? ? for a, b in data_list*10000: ? ? ? ? getmax(a, b) ? ? print(time.time()-t)
自定義的函數(shù)比使用內(nèi)置的max()快了近一倍。
>>> main1()
0.2231442928314209
>>> main2()
0.14011740684509277
計(jì)算三個(gè)數(shù)中的最大值時(shí)也是這樣。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python3用PIL把圖片轉(zhuǎn)換為RGB圖片的實(shí)例
今天小編就為大家分享一篇python3用PIL把圖片轉(zhuǎn)換為RGB圖片的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07python爬蟲中PhantomJS加載頁面的實(shí)例方法
在本篇文章里小編給大家整理了關(guān)于python爬蟲中PhantomJS加載頁面的實(shí)例方法,有需要的朋友們可以參考下。2020-11-11用Python調(diào)用win命令行提高工作效率的實(shí)例
今天小編就為大家分享一篇用Python調(diào)用win命令行提高工作效率的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08python word轉(zhuǎn)pdf代碼實(shí)例
這篇文章主要介紹了python word轉(zhuǎn)pdf代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08六個(gè)Python編程最受用的內(nèi)置函數(shù)使用詳解
在日常的python編程中使用這幾個(gè)函數(shù)來簡化我們的編程工作,經(jīng)常使用能使編程效率大大地提高。本文為大家總結(jié)了六個(gè)Python編程最受用的內(nèi)置函數(shù),感興趣的可以了解一下2022-07-07Python跨文件調(diào)用函數(shù)以及在一個(gè)文件中執(zhí)行另一個(gè)文件
這篇文章主要給大家介紹了關(guān)于Python跨文件調(diào)用函數(shù)以及在一個(gè)文件中執(zhí)行另一個(gè)文件的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-12-12Pycharm導(dǎo)入anaconda環(huán)境的教程圖解
這篇文章主要介紹了Pycharm導(dǎo)入anaconda環(huán)境的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07pytorch?cuda安裝報(bào)錯(cuò)的解決方法
這篇文章主要給大家介紹了關(guān)于pytorch?cuda安裝報(bào)錯(cuò)的解決方法,文中通過圖文介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Pytorch具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-01-01