網站首頁 編程語言 正文
Python數值比較的效率
Python 數值比較運算效率:>,<,==,!=,>=和<=
python數值比較運算有6種,分別為>,<,==,!=,>=和 <=。他們的運算效率如何?采用哪種方式最高效?本文通過使用timeit來測試比較運算的效率。
程序如下:
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語句的情況,結果如下:
比較運算 | 所用時間 |
---|---|
> | 3.2038074 |
< | 2.7034741 |
== | 2.6940471000000006 |
!= | 3.285996800000001 |
>= | 3.205210300000001 |
<= | 2.6961838999999994 |
加上else語句則:
比較運算 | 所用時間 |
---|---|
> | 3.2270024 |
< | 3.2400326 |
== | 3.2511219999999996 |
!= | 3.1877201999999993 |
>= | 3.2120345000000015 |
<= | 3.2339978999999985 |
一般情況下,第一個分支比較節省時間。第二個分支會耗時稍微多一些。
不同python實現的效率比較
1.取出內層容器的多個值
如果要從嵌套的列表中獲取內層列表每個索引對應的最大(或最小值),有兩種方法:
import time
import random
a = [[random.randint(0, 1000) for i in range(10)] for j in range(100000)]
def method_x(a):
?? ?"""每個索引位置一個生成器表達式"""
? ? 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):
?? ?"""只循環一次算出各個索引對應的值"""
? ? 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)
結果
>>> method_x(a*10)
1.1728243827819824
>>> method_y(a*10)
2.1234960556030273
2.字符串去掉結尾(開頭)字符
去除字符串結尾字符,批量操作的話,一般使用 rstrip() 函數,但是這個函數效率不如直接索引快。
import random
import time
# a為10萬個長度是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)
結果比較,當想去掉字符長度大于保留的長度的時候,rstrip() 效率趨近于 replace() , 想去掉的字符長度小于保留部分時,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 操作要用集合
按一樣的邏輯寫了兩版程序,運行時間確差了好多,一步一步找,發現是 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)
測試時間,差距極大:
>>> test(b)
7693
5.649996280670166
>>> test(a)
7693
0.0019681453704833984
每次判斷之前把列表轉換為集合,能改進運行的效率:
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. 內置的max()效率低
def getmax(a, b):
?? ?if a >= b:
?? ??? ?return a
?? ?return b
定義一個求最大值的函數,再用random模塊提前創造一個長度100的data_list用于測試(random本身耗時高,會讓比較效果不明顯)。
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)
自定義的函數比使用內置的max()快了近一倍。
>>> main1()
0.2231442928314209
>>> main2()
0.14011740684509277
計算三個數中的最大值時也是這樣。
總結
原文鏈接:https://blog.csdn.net/weixin_42272768/article/details/125390266
相關推薦
- 2022-05-21 ASP.NET?MVC中_ViewStart.cshtml作用介紹_基礎應用
- 2022-04-22 Mac環境下使用CLion調試redis 6.X源碼
- 2023-02-18 C++中std::thread線程用法_C 語言
- 2022-08-04 python中可以發生異常自動重試庫retrying_python
- 2022-10-01 Android11及以上文件讀寫權限申請詳細介紹_Android
- 2022-07-27 python?iloc和loc切片的實現_python
- 2022-08-26 Input標簽自動校驗功能去除實現_React
- 2022-06-12 C語言函數指針數組實現計算器功能_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支