網(wǎng)站首頁 編程語言 正文
說在最前
不知道小伙伴們在寫代碼的時(shí)候有沒有區(qū)分開numpy.abs和abs函數(shù),別小看這兩個(gè)函數(shù),如果在寫程序的時(shí)候正確區(qū)分使用這兩個(gè)函數(shù)可以使自己的程序運(yùn)行效率大大提升。
別看這兩個(gè)函數(shù)都能對整數(shù)求絕對值,但他們倆的返回值類型完全不一樣,如果傻傻地混為一談,將會使你的程序運(yùn)行時(shí)間被大大拖累!
今天筆者就帶小伙伴們看看,這兩個(gè)函數(shù)究竟該怎么正確使用才能使自己的程序運(yùn)行效率得到提升。
先看示例程序-abs()函數(shù)
注意觀察變量row和語句temp=row-1
import time
row=-1000
row=abs(row) #這里的函數(shù)是abs()
start_time = time.time()#記錄程序運(yùn)行到這(記為A)的時(shí)間
for i in range(row):
for j in range(1000):
temp=row-1 #temp在這里只是用來接收row-1的結(jié)果
end_time = time.time()#記錄程序運(yùn)行到這(記為B)的時(shí)間
print(end_time-start_time)#輸出A和B代碼間的程序運(yùn)行時(shí)間
運(yùn)行時(shí)間為:0.08079314231872559
再看示例程序-numpy.abs()函數(shù)
注意觀察變量row和語句temp=row-1
import numpy
import time
row=-1000
row=numpy.abs(row) #這里的函數(shù)是numpy.abs()
start_time = time.time()#記錄程序運(yùn)行到這(記為A)的時(shí)間
for i in range(row):
for j in range(1000):
temp=row-1 #temp在這里只是用來接收row-1的結(jié)果
end_time = time.time()#記錄程序運(yùn)行到這(記為B)的時(shí)間
print(end_time-start_time)#輸出A和B代碼間的程序運(yùn)行時(shí)間
運(yùn)行時(shí)間為:0.20246124267578125
觀察兩個(gè)程序的結(jié)果
觀察兩個(gè)程序的相同代碼段運(yùn)行時(shí)間的結(jié)果,你會發(fā)現(xiàn)作用都是用來取整的abs()函數(shù)和numpy.abs()函數(shù),運(yùn)行時(shí)間竟然差了大約2.5倍!
小伙伴們看到這里是不是十分驚訝和不解?為什么相同的代碼段運(yùn)行時(shí)間竟然大不相同?雖然在本文章中,它們的相同代碼段運(yùn)行時(shí)間只差了0點(diǎn)幾秒,但是在做數(shù)據(jù)處理時(shí),龐大的數(shù)據(jù)處理足足可以使這微小的差距瞬間拉大,造成本來可以幾秒鐘運(yùn)行結(jié)束的程序你卻用了幾分鐘跑完的尷尬局面。
分析解釋
注意觀察兩個(gè)程序的變量row,
第一個(gè)程序
row=abs(row)
第二個(gè)程序
row=numpy.abs(row)
小伙伴們第一眼看好像這兩個(gè)函數(shù)除了外貌不同外,也沒啥不同,都是對變量row取絕對值,但是這兩個(gè)函數(shù)恰恰在返回值類型上不同。abs()函數(shù)返回的類型是int型而numpy.abs()函數(shù)返回的類型卻是ndarray。小伙伴們可以使用Type()函數(shù)來看變量row的類型,或者去numpy的官網(wǎng)看一下numpy.abs()函數(shù)的說明,鏈接附上:numpy.abs()函數(shù)官方說明
int類型這里不做過多解釋,有興趣的小伙伴可以自己去了解相關(guān)知識。
而ndarray類型,是numpy庫里的數(shù)組類型,它是numpy庫里的一種類(numpy.ndarray),小伙伴們可以去官網(wǎng)上看看有關(guān)ndarray類型的說明。鏈接附上:numpy.ndarray類型官方說明
有了上面的基礎(chǔ),我們再來理解為什么會出現(xiàn)相同代碼段運(yùn)行時(shí)間不同就變得容易許多了。其主要原因在于
temp=row-1
這段代碼。如果row變量是ndarray類型,那么ndarray類型減去int類型(常量1是int類型)就會存在不同類型間的變量進(jìn)行轉(zhuǎn)換的問題(這種轉(zhuǎn)換是系統(tǒng)自己完成的,也可以稱之為隱藏式地轉(zhuǎn)換),這會使程序有額外的開銷,使程序的運(yùn)行效率降低。而如果row變量是int類型就不會出現(xiàn)這種問題,所以這就是使兩段相同的代碼運(yùn)行時(shí)間不同的根本原因所在。
另外numpy.abs()函數(shù)希望的參數(shù)類型是ndarray類型,而abs()函數(shù)希望的參數(shù)類型之一是int類型,所以numpy.abs(row)和abs(row)也存在上述問題。
拓展
雖然numpy.abs()函數(shù)對單個(gè)元素(整型、浮點(diǎn)型等等)的處理較abs()函數(shù)慢,但如果元素很多,可以把這些元素組合起來形成一個(gè)ndarray類型數(shù)組,這時(shí)使用numpy.abs()函數(shù)(ndarray類型做實(shí)際參數(shù))就要比用abs()函數(shù)循環(huán)處理快得多啦。
補(bǔ)充:numpy abs()報(bào)錯(cuò)
我在用numpy的abs()給數(shù)組取絕對值的時(shí)候出現(xiàn)了這個(gè)問題,很明顯是dtype的問題
'<U32'是unsigned 32的含義,那么這個(gè)格式本來就沒有符號,我還非要取絕對值那肯定會報(bào)錯(cuò)的呀!
回過頭去看了看果然是append進(jìn)數(shù)組的時(shí)候忘了把格式強(qiáng)轉(zhuǎn)成float了
OK!轉(zhuǎn)換!解決!
ufunc 'absolute' did not contain a loop with signature matching types dtype('<U32') dtype('<U32')
總結(jié)
單個(gè)元素用abs()函數(shù)
多個(gè)元素并行處理用numpy.abs()函數(shù)
使用函數(shù)和寫代碼時(shí)一定要注意變量隱藏式地轉(zhuǎn)換,因?yàn)檫@能在無形之中拖慢你程序的運(yùn)行速度。
原文鏈接:https://blog.csdn.net/m0_49028841/article/details/120889467
相關(guān)推薦
- 2022-08-17 C++詳解如何通過模板實(shí)現(xiàn)元素的反序_C 語言
- 2023-07-02 Python配置文件管理之ini和yaml文件讀取的實(shí)現(xiàn)_python
- 2022-09-08 Pandas中DataFrame的基本操作之重新索引講解_python
- 2022-08-29 .NET?Core使用Eureka實(shí)現(xiàn)服務(wù)注冊_實(shí)用技巧
- 2022-07-01 Oracle中的索引講解_oracle
- 2023-03-29 Python-apply(lambda?x:?)的使用及說明_python
- 2022-07-21 css讓不定寬高的div,垂直水平居中
- 2023-04-06 C語言順序表的基本操作(初始化,插入,刪除,查詢,擴(kuò)容,打印,清空等)_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支