網站首頁 編程語言 正文
說在最前
不知道小伙伴們在寫代碼的時候有沒有區分開numpy.abs和abs函數,別小看這兩個函數,如果在寫程序的時候正確區分使用這兩個函數可以使自己的程序運行效率大大提升。
別看這兩個函數都能對整數求絕對值,但他們倆的返回值類型完全不一樣,如果傻傻地混為一談,將會使你的程序運行時間被大大拖累!
今天筆者就帶小伙伴們看看,這兩個函數究竟該怎么正確使用才能使自己的程序運行效率得到提升。
先看示例程序-abs()函數
注意觀察變量row和語句temp=row-1
import time
row=-1000
row=abs(row) #這里的函數是abs()
start_time = time.time()#記錄程序運行到這(記為A)的時間
for i in range(row):
for j in range(1000):
temp=row-1 #temp在這里只是用來接收row-1的結果
end_time = time.time()#記錄程序運行到這(記為B)的時間
print(end_time-start_time)#輸出A和B代碼間的程序運行時間
運行時間為:0.08079314231872559
再看示例程序-numpy.abs()函數
注意觀察變量row和語句temp=row-1
import numpy
import time
row=-1000
row=numpy.abs(row) #這里的函數是numpy.abs()
start_time = time.time()#記錄程序運行到這(記為A)的時間
for i in range(row):
for j in range(1000):
temp=row-1 #temp在這里只是用來接收row-1的結果
end_time = time.time()#記錄程序運行到這(記為B)的時間
print(end_time-start_time)#輸出A和B代碼間的程序運行時間
運行時間為:0.20246124267578125
觀察兩個程序的結果
觀察兩個程序的相同代碼段運行時間的結果,你會發現作用都是用來取整的abs()函數和numpy.abs()函數,運行時間竟然差了大約2.5倍!
小伙伴們看到這里是不是十分驚訝和不解?為什么相同的代碼段運行時間竟然大不相同?雖然在本文章中,它們的相同代碼段運行時間只差了0點幾秒,但是在做數據處理時,龐大的數據處理足足可以使這微小的差距瞬間拉大,造成本來可以幾秒鐘運行結束的程序你卻用了幾分鐘跑完的尷尬局面。
分析解釋
注意觀察兩個程序的變量row,
第一個程序
row=abs(row)
第二個程序
row=numpy.abs(row)
小伙伴們第一眼看好像這兩個函數除了外貌不同外,也沒啥不同,都是對變量row取絕對值,但是這兩個函數恰恰在返回值類型上不同。abs()函數返回的類型是int型而numpy.abs()函數返回的類型卻是ndarray。小伙伴們可以使用Type()函數來看變量row的類型,或者去numpy的官網看一下numpy.abs()函數的說明,鏈接附上:numpy.abs()函數官方說明
int類型這里不做過多解釋,有興趣的小伙伴可以自己去了解相關知識。
而ndarray類型,是numpy庫里的數組類型,它是numpy庫里的一種類(numpy.ndarray),小伙伴們可以去官網上看看有關ndarray類型的說明。鏈接附上:numpy.ndarray類型官方說明
有了上面的基礎,我們再來理解為什么會出現相同代碼段運行時間不同就變得容易許多了。其主要原因在于
temp=row-1
這段代碼。如果row變量是ndarray類型,那么ndarray類型減去int類型(常量1是int類型)就會存在不同類型間的變量進行轉換的問題(這種轉換是系統自己完成的,也可以稱之為隱藏式地轉換),這會使程序有額外的開銷,使程序的運行效率降低。而如果row變量是int類型就不會出現這種問題,所以這就是使兩段相同的代碼運行時間不同的根本原因所在。
另外numpy.abs()函數希望的參數類型是ndarray類型,而abs()函數希望的參數類型之一是int類型,所以numpy.abs(row)和abs(row)也存在上述問題。
拓展
雖然numpy.abs()函數對單個元素(整型、浮點型等等)的處理較abs()函數慢,但如果元素很多,可以把這些元素組合起來形成一個ndarray類型數組,這時使用numpy.abs()函數(ndarray類型做實際參數)就要比用abs()函數循環處理快得多啦。
補充:numpy abs()報錯
我在用numpy的abs()給數組取絕對值的時候出現了這個問題,很明顯是dtype的問題
'<U32'是unsigned 32的含義,那么這個格式本來就沒有符號,我還非要取絕對值那肯定會報錯的呀!
回過頭去看了看果然是append進數組的時候忘了把格式強轉成float了
OK!轉換!解決!
ufunc 'absolute' did not contain a loop with signature matching types dtype('<U32') dtype('<U32')
總結
單個元素用abs()函數
多個元素并行處理用numpy.abs()函數
使用函數和寫代碼時一定要注意變量隱藏式地轉換,因為這能在無形之中拖慢你程序的運行速度。
原文鏈接:https://blog.csdn.net/m0_49028841/article/details/120889467
相關推薦
- 2022-07-20 Flutter系統網絡圖片加載流程解析_Android
- 2022-12-13 bat文件與Vbs文件之間的常用操作(獲取用戶輸入,執行VBS文件)_DOS/BAT
- 2022-04-22 Golang開發中常見錯誤以及注釋、規范代碼風格
- 2022-04-11 Xamarin.Forms在安卓機上進行本機調試_實用技巧
- 2022-05-17 ubuntu解決虛擬機Ubuntu連接不了網絡(親測)
- 2022-08-23 Python利用VideoCapture讀取視頻或攝像頭并進行保存_python
- 2022-07-21 react 高價組件HOC實現組件復用
- 2022-10-23 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同步修改后的遠程分支