您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Python標(biāo)準(zhǔn)庫(kù)及第三方庫(kù)怎么使用”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
time模塊是Python專門(mén)用來(lái)處理時(shí)間的內(nèi)建庫(kù)。它自帶了很多方法,可以將不同的時(shí)間類型進(jìn)行相互轉(zhuǎn)換,例如可以將時(shí)間戳類型轉(zhuǎn)換為時(shí)間元組、時(shí)間元組轉(zhuǎn)換為格式化時(shí)間、 格式化時(shí)間轉(zhuǎn)換為時(shí)間戳......
在Python中,通常有這幾種方式來(lái)表示時(shí)間:
時(shí)間戳:time.time(),無(wú)參數(shù),獲取當(dāng)前時(shí)間時(shí)間戳,浮點(diǎn)型;
時(shí)間字符串:time.ctime(),秒 ->字符串;time.asctime(),元組 -> 字符串;
時(shí)間元組(struct_time):time.localtime()
格式化時(shí)間:time.strftime()
import time # 時(shí)間戳類型 t1 = time.time() print(t1) r_time = round(t1 * 1000)# 四舍五入,精確到毫秒 print(r_time) ''' 1677555790.7605402 1677555790761 ''' # 時(shí)間字符串 t2 = time.asctime() print(t2) ''' Tue Feb 28 11:44:15 2023 ''' # 時(shí)間元組 t3 = time.localtime() print(t3) ''' 依次對(duì)應(yīng):年份,月份,一個(gè)月的第幾天,幾點(diǎn),幾分,幾秒,星期幾,一年中的第幾天,是否為閏年 time.struct_time(tm_year=2023, tm_mon=2, tm_mday=28, tm_hour=11, tm_min=44, tm_sec=53, tm_wday=1, tm_yday=59, tm_isdst=0) '''
時(shí)間戳類型可以轉(zhuǎn)換為時(shí)間元組、時(shí)間元組可以轉(zhuǎn)換為格式化時(shí)間、 格式化時(shí)間可以轉(zhuǎn)換為時(shí)間戳...
time.time() 返回當(dāng)前時(shí)間的時(shí)間戳 返回值形式:1677563451.2548294
time.localtime() 返回當(dāng)前時(shí)間的時(shí)間元組,返回值形式:time.struct_time(tm_year=2023, tm_mnotallow=2, tm_mday=28, tm_hour=13, tm_min=52, tm_sec=2, tm_wday=1, tm_yday=59, tm_isdst=0)
time.mktime() 將時(shí)間元組轉(zhuǎn)換為浮點(diǎn)型時(shí)間,返回值形式:1677556220.0
# 時(shí)間戳?xí)r間元組 相互轉(zhuǎn)換 # 1-時(shí)間戳轉(zhuǎn)換為時(shí)間元組 tt1 = time.localtime(time.time()) print(tt1) ''' time.struct_time(tm_year=2023, tm_mon=2, tm_mday=28, tm_hour=11, tm_min=48, tm_sec=57, tm_wday=1, tm_yday=59, tm_isdst=0) ''' # 2-時(shí)間元組轉(zhuǎn)換為時(shí)間戳 tt2 = time.mktime(time.localtime()) print(tt2) ''' 1677556220.0 '''
time.strftime() 傳入時(shí)間元組,可以將時(shí)間元組轉(zhuǎn)換為格式化時(shí)間,返回值形式:2023-02-28 13:52:02
time.strptime() 傳入格式化時(shí)間,可以將格式化時(shí)間轉(zhuǎn)換為時(shí)間元組,返回值形式:time.struct_time(tm_year=2023, tm_mon=2, tm_mday=28, tm_hour=13, tm_min=52, tm_sec=2, tm_wday=1, tm_yday=59, tm_isdst=0)
# 時(shí)間元組格式化時(shí)間 相互轉(zhuǎn)換 # 1-時(shí)間元組轉(zhuǎn)換為格式化時(shí)間 tt3 = time.localtime() print(time.strftime("%Y-%m-%d %H:%M:%S".format(tt3))) ''' 2023-02-28 13:52:02 ''' # 2-格式化時(shí)間轉(zhuǎn)換為時(shí)間元組 tt4 = time.strptime("2023-02-28 11:54:25", "%Y-%m-%d %H:%M:%S") print(tt4) ''' time.struct_time(tm_year=2023, tm_mon=2, tm_mday=28, tm_hour=11, tm_min=54, tm_sec=25, tm_wday=1, tm_yday=59, tm_isdst=-1) '''
時(shí)間戳和格式化時(shí)間之間,并不能直接相互轉(zhuǎn)換,中間要借助時(shí)間元組過(guò)度、來(lái)進(jìn)行轉(zhuǎn)換。
# 時(shí)間戳格式化時(shí)間 相互轉(zhuǎn)換 # 1-格式化時(shí)間轉(zhuǎn)換為時(shí)間戳 time_format = "2023-02-28 19:11:56" # 先將格式化時(shí)間轉(zhuǎn)換為時(shí)間元組 time_stamp1 = time.strptime(time_format, "%Y-%m-%d %H:%M:%S") # 再將時(shí)間元組轉(zhuǎn)換為時(shí)間戳 tt7 = time.mktime(time_stamp1) print(tt7) ''' 1677582716.0 ''' # 2-時(shí)間戳轉(zhuǎn)換為格式化時(shí)間 time_stamp2 = 1677582716.0 tt8 = time.strftime("%Y-%m-%d %H:%M:%S".format(time_stamp2)) print(tt8) ''' 2023-02-28 19:11:56 '''
time.asctime() 時(shí)間元組轉(zhuǎn)換為時(shí)間字符串,參數(shù)為時(shí)間元組,返回值形式:Tue Feb 28 11:51:05 2023;
time.ctime() 時(shí)間戳轉(zhuǎn)換為時(shí)間字符串,參數(shù)為時(shí)間戳,返回值形式:Tue Feb 28 11:51:05 2023;
# 指定類型時(shí)間轉(zhuǎn)換為時(shí)間字符串 # 1-時(shí)間元組轉(zhuǎn)換為時(shí)間字符串 tt5 = time.asctime(time.localtime()) print(tt5) ''' Tue Feb 28 11:51:05 2023 ''' # 2-時(shí)間戳轉(zhuǎn)換為時(shí)間字符串 timestamp = 1677582279.0 tt6 = time.ctime(timestamp) print(tt6) ''' Tue Feb 28 11:51:05 2023 '''
datetime是Python中自帶的、用來(lái)處理時(shí)間日期的模塊。在Python中表示時(shí)間的格式有三種:時(shí)間戳、元組、格式化時(shí)間。與time模塊類似,datetime模塊也能夠?qū)atetime類型轉(zhuǎn)換成這三種類型。
datetime常用的幾大類,分別為:
date:日期類,主要用來(lái)處理年、月、日;
time:時(shí)間類,主要用來(lái)處理時(shí)、分、秒;
datetime:日期時(shí)間類,date類和time類的綜合使用,可以用來(lái)處理年、月、日、時(shí)、分、秒;
timedelta:表示時(shí)間間隔,用來(lái)處理時(shí)間加減;
tzinfo:用來(lái)處理時(shí)區(qū)信息;
date類包含三個(gè)參數(shù),分別為:year,month,day,返回格式為year-month-day。
import datetime # 設(shè)置指定日期 set_date = datetime.date(day=1, month=3, year=2025) print(set_date)# 2025-03-01
# 獲取今天日期的年份、月份、日 today = datetime.date.today() print("標(biāo)準(zhǔn)日期格式:", today.isoformat())# 標(biāo)準(zhǔn)日期格式: 2023-03-01 print("當(dāng)前日期的三元元祖: 年、第幾周、一周的第幾天:", today.isocalendar())# 當(dāng)前日期的三元元祖: 年、第幾周、一周的第幾天: (2023, 9, 3) print("當(dāng)前日期:", today)# 當(dāng)前日期: 2023-03-01 print("當(dāng)前年月日:", today.today())# 當(dāng)前年月日: 2023-03-01 print("當(dāng)前年份:", today.year)# 當(dāng)前年份: 2023 print("當(dāng)前月份:", today.month)# 當(dāng)前月份: 3 print("當(dāng)前日:", today.day)# 當(dāng)前日: 1
# 判斷今天是這周的第幾天 today = datetime.date.today() print("當(dāng)前日期是這周的第幾天(星期一==0/周日==6):", today.weekday())# 當(dāng)前日期是這周的第幾天(星期一==0/周日==6): 2 print("當(dāng)前日期是這周的第幾天(星期一==1/周日==7):", today.isoweekday())# 當(dāng)前日期是這周的第幾天(星期一==1/周日==7): 3
# 當(dāng)前日期的其他格式 today = datetime.date.today() print("當(dāng)前日期的時(shí)間字符串形式:", today.ctime())# 當(dāng)前日期的時(shí)間字符串形式: Wed Mar1 00:00:00 2023 print("當(dāng)前日期的元組形式:", today.timetuple()) print("當(dāng)前日期的格式化時(shí)間形式:", today.strftime("%Y-%m-%d %H:%M:%S"))# 當(dāng)前日期的格式化時(shí)間形式: 2023-03-01 00:00:00
# 替換日期 today = datetime.date.today() new_day = today.replace(year=2038, month=8, day=31) print("替換后的日期為:", new_day)# 替換后的日期為: 2038-08-31
# 指定格式轉(zhuǎn)換為日期 today = datetime.date.today() t1 = today.fromtimestamp(1691453288)# 注意精確到秒、不是毫秒 print("從時(shí)間戳轉(zhuǎn)換為日期:", t1)# 從時(shí)間戳轉(zhuǎn)換為日期: 2023-08-08 t2 = today.fromisoformat("2025-03-03") print("從三元組轉(zhuǎn)換為日期:", t2)# 從三元組轉(zhuǎn)換為日期: 2025-03-03 t3 = today.fromisocalendar(year=2038, week=9, day=7) print("從三元組轉(zhuǎn)換為日期:", t3)# 從三元組轉(zhuǎn)換為日期: 2038-03-07
datetime.time() 可以傳遞多個(gè)參數(shù):
hour 小時(shí)
minute 分鐘
second 秒
microsecond 微秒
tzinfo 時(shí)區(qū)
t = datetime.time(hour=12, minute=59, second=59, microsecond=59)# 實(shí)例化time對(duì)象,傳入時(shí)、分、秒、微秒 print("當(dāng)前時(shí)間:", t)# 當(dāng)前時(shí)間: 12:59:59.000059 # 常用屬性 print("時(shí):", t.hour)# 時(shí): 12 print("分:", t.minute)# 分: 59 print("秒:", t.second)# 秒: 59 print("微秒:", t.microsecond)# 微秒: 59 print("最大時(shí)間:", t.max)# 最大時(shí)間: 23:59:59.999999 print("最小時(shí)間:", t.min)# 最小時(shí)間: 00:00:00
t = datetime.time(hour=12, minute=59, second=59, microsecond=59)# 實(shí)例化time對(duì)象,傳入時(shí)、分、秒、微秒 print("當(dāng)前時(shí)間:", t)# 當(dāng)前時(shí)間: 12:59:59.000059 # 常用方法 print("返回格式化時(shí)間:", t.isoformat())# 格式化時(shí)間: 12:59:59.000059 print("從格式化時(shí)間轉(zhuǎn)換:", t.fromisoformat('12:00:00'))# 從格式化時(shí)間轉(zhuǎn)換: 12:00:00 print("轉(zhuǎn)換為格式化時(shí)間:", t.strftime("%Y-%m %H:%M:%S"))# 轉(zhuǎn)換為格式化時(shí)間: 1900-01 12:59:59
dt = datetime.datetime.now()# 實(shí)例化datetime類 print("當(dāng)前日期:", dt)# 當(dāng)前日期: 2023-03-01 15:17:00.350579 # 常用屬性 print("當(dāng)前年份:", dt.year)# 當(dāng)前年份: 2023 print("當(dāng)前月份:", dt.month)# 當(dāng)前月份: 3 print("當(dāng)前日:", dt.day)# 當(dāng)前日: 1 print("時(shí):", dt.hour)# 時(shí): 15 print("分:", dt.minute)# 分: 17 print("秒:", dt.second)# 秒: 0 print("微秒:", dt.microsecond)# 微秒: 350579 print("最大時(shí)間:", dt.max)# 最大時(shí)間: 9999-12-31 23:59:59.999999 print("最小時(shí)間:", dt.min)# 最小時(shí)間: 0001-01-01 00:00:00
dt = datetime.datetime.now()# 實(shí)例化datetime類 print("當(dāng)前日期:", dt)# 當(dāng)前日期: 2023-03-01 15:17:00.350579 # 常用方法 print("今天日期時(shí)間:", dt.today())# 今天日期時(shí)間: 2023-03-01 15:23:55.703063 print("當(dāng)前日期:", dt.date())# 當(dāng)前日期: 2023-03-01 print("當(dāng)前日期時(shí)間的格式化輸出:", dt.isoformat())# 當(dāng)前日期時(shí)間的格式化輸出: 2023-03-01T15:23:55.703063 print("當(dāng)前日期的三元組:", dt.isocalendar())# 當(dāng)前日期的三元組: (2023, 9, 3) print("當(dāng)前日期一周中的第幾天:", dt.isoweekday())# 當(dāng)前日期一周中的第幾天: 3 print("從指定日期時(shí)間轉(zhuǎn)換并格式化輸出:", dt.fromisoformat("2023-02-28 19:11:56"))# 從指定日期時(shí)間轉(zhuǎn)換并格式化輸出: 2023-02-28 19:11:56 print("從指定時(shí)間戳轉(zhuǎn)換并格式化輸出:", dt.fromtimestamp(1677644920))# 從指定時(shí)間戳轉(zhuǎn)換并格式化輸出: 2023-03-01 12:28:40 print("從三元組轉(zhuǎn)換并格式化輸出:", dt.fromisocalendar(year=2025, week=4, day=2))# 從三元組轉(zhuǎn)換并格式化輸出: 2025-01-21 00:00:00
datetime.timedelta() 類可以傳遞多個(gè)參數(shù),用來(lái)表示時(shí)間間隔,返回形式為標(biāo)準(zhǔn)時(shí)間格式:0:00:00
days:時(shí)間間隔單位為天
hour:時(shí)間間隔單位為小時(shí)
minute:時(shí)間間隔單位為分鐘
second:時(shí)間間隔單位為秒
milliseconds:時(shí)間間隔單位為毫秒
microsecond:時(shí)間間隔單位為微秒
print(datetime.timedelta(days=3))# 3 days, 0:00:00 print(datetime.timedelta(hours=3))# 3:00:00 print(datetime.timedelta(minutes=10))# 0:10:00 print(datetime.timedelta(milliseconds=5000))# 0:00:05 print(datetime.timedelta(microseconds=5000000))# 0:00:05
timeit 模塊提供了多種方法,可以用來(lái)測(cè)量 Python 小段代碼執(zhí)行時(shí)間。它既可以在命令行界面直接使用,也可以通過(guò)導(dǎo)入模塊進(jìn)行調(diào)用。
timeit 模塊定義了三個(gè)實(shí)用函數(shù)和一個(gè)公共類,分別為timeit.timeit()方法、timeit.repeat()方法、timeit.default_timer()方法、timeit.Timer類。部分源碼如下:
def timeit(stmt="pass", setup="pass", timer=default_timer, number=default_number, globals=None): """Convenience function to create Timer object and call timeit method.""" return Timer(stmt, setup, timer, globals).timeit(number) def repeat(stmt="pass", setup="pass", timer=default_timer, repeat=default_repeat, number=default_number, globals=None): """Convenience function to create Timer object and call repeat method.""" return Timer(stmt, setup, timer, globals).repeat(repeat, number)
從上述源碼中可以看出,無(wú)論是timeit還是repeat方法,都是先生成Timer對(duì)象,然后調(diào)用了Timer對(duì)象的timeit或repeat函數(shù)。
timeit.timeit(stmt='pass', setup='pass', timer=
, number=1000000)
創(chuàng)建一個(gè) Timer 實(shí)例,參數(shù)分別是:
stmt(需要測(cè)量的語(yǔ)句或函數(shù))
setup(初始化代碼或構(gòu)建環(huán)境的導(dǎo)入語(yǔ)句)
timer(計(jì)時(shí)函數(shù))
number(每一次測(cè)量中語(yǔ)句被執(zhí)行的次數(shù))
注:由于 timeit() 正在執(zhí)行語(yǔ)句,語(yǔ)句中如果存在返回值的話會(huì)阻止 timeit() 返回執(zhí)行時(shí)間。timeit() 會(huì)取代原語(yǔ)句中的返回值。
"""timeit()方法""" # 統(tǒng)計(jì)代碼運(yùn)行時(shí)間 # stmt:要測(cè)試的代碼,setup:初始化導(dǎo)入語(yǔ)句、要傳入的變量屬性等 tm1 = timeit.timeit(stmt="[i**2 for i in testlist]", setup="testlist=range(1000)", number=3)# 統(tǒng)計(jì)代碼運(yùn)行時(shí)間 print(tm1)# 0.0007954000000000017 # 統(tǒng)計(jì)代碼運(yùn)行時(shí)間,setup為復(fù)合語(yǔ)句 tm2 = timeit.timeit(stmt="[i**2 for i in testlist]", setup="a=1000;testlist=range(a)", number=3)# 統(tǒng)計(jì)代碼運(yùn)行時(shí)間 print(tm2)# 0.0007886000000000282
timeit.repeat(stmt='pass', setup='pass', timer=
, repeat=3, number=1000000)
創(chuàng)建一個(gè) Timer 實(shí)例,參數(shù)分別是:
stmt(需要測(cè)量的語(yǔ)句或函數(shù))
setup(初始化代碼或構(gòu)建環(huán)境的導(dǎo)入語(yǔ)句)
timer(計(jì)時(shí)函數(shù))
repeat(重復(fù)測(cè)量的次數(shù))
number(每一次測(cè)量中語(yǔ)句被執(zhí)行的次數(shù))
"""repeat()方法""" # 統(tǒng)計(jì)代碼運(yùn)行時(shí)間,重復(fù)兩次,返回結(jié)果為列表 # stmt:要測(cè)試的代碼,setup:初始化導(dǎo)入語(yǔ)句、要傳入的變量屬性等 tp1 = timeit.repeat(stmt="[i**2 for i in testlist]", setup="testlist=range(1000)", number=3, repeat=5) print(tp1)# [0.0007632000000000194, 0.0007527999999999979, 0.000754300000000041] # 統(tǒng)計(jì)代碼運(yùn)行時(shí)間,setup為復(fù)合語(yǔ)句 tp2 = timeit.repeat(stmt="[i**2 for i in testlist]", setup="a=1000;testlist=range(a)", number=3, repeat=5) print(tp2)# [0.0007581999999999867, 0.0007580999999999838, 0.0007536000000000209]
timeit.default_timer()默認(rèn)的計(jì)時(shí)器,一般是 time.perf_counter(),time.perf_counter() 方法能夠在任一平臺(tái)提供最高精度的計(jì)時(shí)器(它也只是記錄了自然時(shí)間,記錄自然時(shí)間會(huì)被很多其他因素影響,例如計(jì)算機(jī)的負(fù)載)。
timeit.Timer是計(jì)算小段代碼執(zhí)行速度的類:
timer = timeit.Timer(stmt='pass', setup='pass', timer=
timer.timeit(number=10)
timer.repeat(number=10, repeat=5)
構(gòu)造函數(shù)需要的參數(shù)有:
stmt(需要測(cè)量的語(yǔ)句或函數(shù))
setup(初始化代碼或構(gòu)建環(huán)境的導(dǎo)入語(yǔ)句)
timer(計(jì)時(shí)函數(shù))
前兩個(gè)參數(shù)的默認(rèn)值都是 'pass',timer 參數(shù)是平臺(tái)相關(guān)的;前兩個(gè)參數(shù)都可以包含多個(gè)語(yǔ)句,多個(gè)語(yǔ)句間使用分號(hào)(;)或新行分隔開(kāi)。
第一次測(cè)試語(yǔ)句的時(shí)間,可以使用 timeit() 方法;repeat() 方法相當(dāng)于持續(xù)多次調(diào)用 timeit() 方法并將結(jié)果返回為一個(gè)列表。
stmt 和 setup 參數(shù)也可以是可供調(diào)用但沒(méi)有參數(shù)的對(duì)象,這將會(huì)在一個(gè)計(jì)時(shí)函數(shù)中嵌套調(diào)用它們,然后被 timeit() 所執(zhí)行。注意,由于額外的調(diào)用,計(jì)時(shí)開(kāi)銷會(huì)相對(duì)略到。
"""Timer類""" timer = timeit.Timer(stmt="[i**2 for i in testlist]", setup="a=1000;testlist=range(a)") # 調(diào)用timeit方法 print(timer.timeit(number=3))# 0.0008310999999999735 # 調(diào)用repeat方法,返回一個(gè)時(shí)間列表 print(timer.repeat(number=3, repeat=3))# [0.0007549000000000028, 0.0007492000000000054, 0.0007519999999999749]
通過(guò)"python -m timeit -h"查看幫助信息:
Tool for measuring execution time of small code snippets.
用于測(cè)量小代碼片段執(zhí)行時(shí)間的工具。
This module avoids a number of common traps for measuring execution
times. See also Tim Peters' introduction to the Algorithms chapter in
the Python Cookbook, published by O'Reilly.
該模塊避免了許多用于測(cè)量執(zhí)行情況的常見(jiàn)陷阱時(shí)間。另請(qǐng)參見(jiàn)Tim Peters在由O'Reilly出版的Python Cookbook。
Library usage: see the Timer class.
庫(kù)用法:請(qǐng)參閱Timer類。
Command line usage:
命令行用法:
python timeit.py [-n N] [-r N] [-s S] [-p] [-h] [--] [statement]
Options: 選項(xiàng):
-n/--number N: how many times to execute 'statement' (default: see below)
-r/--repeat N: how many times to repeat the timer (default 5)
-s/--setup S: statement to be executed once initially (default 'pass').
Execution time of this setup statement is NOT timed.
-p/--process: use time.process_time() (default is time.perf_counter())
-v/--verbose: print raw timing results; repeat for more digits precision
-u/--unit: set the output time unit (nsec, usec, msec, or sec)
-h/--help: print this usage message and exit
--: separate options from statement, use when statement starts with -
statement: statement to be timed (default 'pass')
A multi-line statement may be given by specifying each line as a
separate argument; indented lines are possible by enclosing an
argument in quotes and using leading spaces. Multiple -s options are
treated similarly.
多行語(yǔ)句可以通過(guò)將每一行指定為獨(dú)立論證;縮進(jìn)的行可以通過(guò)括起引號(hào)中的參數(shù),并使用前導(dǎo)空格。多個(gè)-s選項(xiàng)包括類似地處理。
If -n is not given, a suitable number of loops is calculated by trying
successive powers of 10 until the total time is at least 0.2 seconds.
如果未給定-n,則通過(guò)嘗試直到總時(shí)間至少為0.2秒。
Note: there is a certain baseline overhead associated with executing a
pass statement. It differs between versions. The code here doesn't try
to hide it, but you should be aware of it. The baseline overhead can be
measured by invoking the program without arguments.
注意:執(zhí)行pass語(yǔ)句。不同版本之間有所不同。這里的代碼無(wú)法嘗試隱藏它,但你應(yīng)該意識(shí)到它?;€開(kāi)銷可以是通過(guò)調(diào)用不帶參數(shù)的程序來(lái)度量。
Classes:
Timer
Functions:
timeit(string, string) -> float
repeat(string, string) -> list
default_timer() -> float
具體用法:
python timeit.py [-n N] [-r N] [-s S] [-p] [-h] [--] [statement]
各個(gè)選項(xiàng)的含義:
選項(xiàng) | 原型 | 含義 |
-n N | --number=N | 語(yǔ)句被執(zhí)行的次數(shù) |
-r N | --repeat=N | 重復(fù)測(cè)試的次數(shù)(默認(rèn)5次) |
-s S | --setup=S | 初始執(zhí)行的語(yǔ)句,例如:要傳入的變量、屬性等 |
-p | --process | 測(cè)量進(jìn)程時(shí)間而不是實(shí)際執(zhí)行時(shí)間(使用 time.process_time() 代替默認(rèn)的 time.perf_counter()) |
-v | --verbose | 打印原始計(jì)時(shí)結(jié)果;重復(fù)以獲得更多數(shù)字精度 |
-u | --unit | 設(shè)置輸出時(shí)間單位(nsec、usec、msec或sec) |
-h | --help | 輸出幫助信息 |
-- | 將選項(xiàng)與語(yǔ)句分開(kāi),當(dāng)語(yǔ)句以開(kāi)頭時(shí)使用- | |
statement | 要計(jì)時(shí)的語(yǔ)句(默認(rèn)為“pass”) |
這種場(chǎng)景主要適用于在接口傳參時(shí)的時(shí)間日期轉(zhuǎn)換,因?yàn)樵诤蠖私涌趥鲄⒅校话愣际怯脮r(shí)間戳進(jìn)行傳遞,而不是傳統(tǒng)的"2023-02-28 19:11:56"格式。例如當(dāng)前有一個(gè)新增車輛的接口,其中部分字段涉及到時(shí)間日期轉(zhuǎn)換:道路運(yùn)輸證有效期止、行駛證有效期止:
在頁(yè)面上我選擇的都是2023-03-31,但在真實(shí)的接口傳參中,會(huì)自動(dòng)將其轉(zhuǎn)換為時(shí)間戳的形式:
時(shí)間2023-03-31自動(dòng)轉(zhuǎn)換為了時(shí)間戳1680192000000,我們?cè)偻ㄟ^(guò)工具將1680192000000轉(zhuǎn)換為正常的格式化時(shí)間看看確實(shí)為2023-03-31,轉(zhuǎn)換正確:
時(shí)間戳轉(zhuǎn)換網(wǎng)站:http://kemok4.com/link/6e187996e9cc9d93c5f4452695768290
使用Python進(jìn)行接口測(cè)試或模擬接口調(diào)用,也需要傳遞時(shí)間戳,Python中time.time()可以直接獲取到當(dāng)前時(shí)間的時(shí)間戳,但是獲取到的是浮點(diǎn)型的數(shù),可以借助round方法進(jìn)行四舍五入,然后再*1000,從而精確到毫秒:
# 獲取當(dāng)前時(shí)間的時(shí)間戳 current_time = time.time() print(current_time)# 1677635951.946926 timestamp = round(current_time) * 1000 print(timestamp)# 1677635952000 # 將時(shí)間戳轉(zhuǎn)換為格式化時(shí)間 format_time = time.strftime("%Y-%m-%d %H:%M:%S".format(current_time)) print(format_time)# 2023-03-01 09:59:11
將上述代碼優(yōu)化一下,封裝成函數(shù),直接進(jìn)行調(diào)用:
def get_current_timestamp(): # 獲取當(dāng)前時(shí)間的時(shí)間戳 current_time = time.time() timestamp = round(current_time) * 1000 return timestamp def timestamp_to_format(timestamp): # 將時(shí)間戳轉(zhuǎn)換為格式化時(shí)間 format_time = time.strftime("%Y-%m-%d %H:%M:%S".format(timestamp)) return format_time
同樣是模擬接口調(diào)用,但是在造數(shù)據(jù)時(shí),時(shí)間字段我想要模擬的不是當(dāng)前時(shí)間,而是指定的日期時(shí)間,如三小時(shí)前、三天前等。以下分別介紹time模塊和datetime模塊如何快速模擬指定時(shí)間:
我們都知道1小時(shí)有3600秒,也就是3600*1000毫秒,所以如果是模擬3小時(shí)前的時(shí)間戳,則只需要拿到當(dāng)前時(shí)間的時(shí)間戳-3600*1000*3即可:
def get_current_timestamp(): # 獲取當(dāng)前時(shí)間的時(shí)間戳 current_time = time.time() timestamp = round(current_time) * 1000 return timestamp three_hour_timestamp = get_current_timestamp() - 3600 * 3 * 1000 print(three_hour_timestamp)# 1677630754000
通過(guò)站長(zhǎng)工具轉(zhuǎn)換時(shí)間戳為格式化時(shí)間,確實(shí)是3個(gè)小時(shí)前的時(shí)間:
使用time模塊處理的話需要經(jīng)過(guò)一些計(jì)算,而使用datetime模塊的timedelta類處理則簡(jiǎn)單得多,直接填寫(xiě)間隔的時(shí)長(zhǎng)即可,可以是天、小時(shí)、分鐘、秒等,獲取當(dāng)前日期時(shí)間的三天前的時(shí)間戳,整體過(guò)程大致分為以下步驟:
通過(guò)datetime.datetime.now()方法獲取當(dāng)前日期時(shí)間;
用當(dāng)前日期時(shí)間減去datetime.timedelta(days=3)返回的時(shí)間間隔,得到三天前的日期時(shí)間;
用three_days_ago_date.timestamp()將三天前的日期時(shí)間轉(zhuǎn)換為時(shí)間戳,注意這里得到的是浮點(diǎn)數(shù),且精確到秒,而后端接口傳參類型是整數(shù)、精確到毫秒,所以我做了int和乘1000的處理。并非所有接口都是這樣,不同的接口視具體傳參要求而定;
# 獲取當(dāng)前日期時(shí)間 now_date = datetime.datetime.now() print(now_date)# 2023-03-01 11:47:06.361630 # 獲取三天前的日期時(shí)間 three_days_ago_date = datetime.datetime.now() - datetime.timedelta(days=3) print(three_days_ago_date) # 將時(shí)間元組轉(zhuǎn)換為時(shí)間戳 time_tup = int(three_days_ago_date.timestamp() * 1000) print(time_tup)# 1677399019273
這種情況常常用在文件命名上,比如日志文件,通過(guò)文件名,可以區(qū)分是具體是什么日期時(shí)間生成的日志。例如:
# 定義log生成路徑、log文件名稱 logTime = time.strftime('%Y_%m_%d-%H_%M_%S', time.localtime(time.time())) # logPath = os.path.dirname(os.path.abspath('.')) + '\log\' logPath = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + '\logs\' logName = logPath + logger + "_" + logTime + '.log'
生成的日志文件如下:
在之前介紹裝飾器的時(shí)候,我們有個(gè)案例就是通過(guò)time模塊來(lái)統(tǒng)計(jì)代碼運(yùn)行時(shí)間的,示例如下:
def timer(func): def wrapper(*args, **kwargs): start_time = time.time() res = func(*args, **kwargs) end_time = time.time() timer = end_time - start_time print("%s函數(shù)運(yùn)行共耗時(shí): %s秒" % (func.__name__, timer)) return res return wrapper @timer def run_timer(): time.sleep(1) print("測(cè)試---統(tǒng)計(jì)函數(shù)運(yùn)行時(shí)間") run_timer() ''' 測(cè)試---統(tǒng)計(jì)函數(shù)運(yùn)行時(shí)間 run_timer函數(shù)運(yùn)行共耗時(shí): 1.0101909637451172秒 '''
import time import timeit def run_time(): # 被測(cè)函數(shù) time.sleep(1) print("used 1 second") # 統(tǒng)計(jì)代碼運(yùn)行時(shí)間 # stmt:要測(cè)試的代碼,setup:要傳入的變量屬性等,number:每次測(cè)量中語(yǔ)句被執(zhí)行的次數(shù) tt = timeit.timeit(stmt=lambda: run_time(), number=3) print(tt) ''' used 1 second used 1 second used 1 second 3.001044 ''' # 統(tǒng)計(jì)代碼運(yùn)行時(shí)間,返回結(jié)果為列表 # stmt:要測(cè)試的代碼,setup:要傳入的變量屬性等,repeat:重復(fù)測(cè)試的次數(shù),number:每次測(cè)量中語(yǔ)句被執(zhí)行的次數(shù) tp = timeit.repeat(stmt="[i * 2 for i in testlist]", setup="testlist=range(1000)", repeat=5, number=1) print(tp) ''' [0.00011680000000025004, 9.259999999988722e-05, 8.76000000000765e-05] '''
“Python標(biāo)準(zhǔn)庫(kù)及第三方庫(kù)怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。