Zeitverarbeitung ist eine häufige Situation in der Programmierung, beispielsweise beim Konvertieren von Zeittypen: Wenn die Back-End-Schnittstelle Parameter übergibt, übergibt sie normalerweise einen Zeitstempel im vom Front-End erhaltenen Schnittstellenrückgabewert vor der Anzeige formatiert werden. In Python umfassen Module, die Zeit verarbeiten, time und datetime.
Das Zeitmodul ist eine integrierte Bibliothek von Python, die speziell für die Zeitverarbeitung verwendet wird. Es verfügt über viele Methoden, die verschiedene Zeittypen ineinander umwandeln können. Sie können beispielsweise Zeitstempeltypen in Zeittupel, Zeittupel in formatierte Zeit, formatierte Zeit in Zeitstempel konvertieren ... .
In Python gibt es normalerweise mehrere Möglichkeiten, Zeit darzustellen:
import time # 时间戳类型 t1 = time.time() print(t1) r_time = round(t1 * 1000)# 四舍五入,精确到毫秒 print(r_time) ''' 1677555790.7605402 1677555790761 ''' # 时间字符串 t2 = time.asctime() print(t2) ''' Tue Feb 28 11:44:15 2023 ''' # 时间元组 t3 = time.localtime() print(t3) ''' 依次对应:年份,月份,一个月的第几天,几点,几分,几秒,星期几,一年中的第几天,是否为闰年 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) '''
#🎜🎜 #① Zeitstempel
Gegenseitige Zeittupelkonvertierungtime.time () Gibt den Zeitstempel der aktuellen Zeit zurück. Das Rückgabewertformat ist: 1677563451.2548294# 时间戳<===>时间元组 相互转换 # 1-时间戳转换为时间元组 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-时间元组转换为时间戳 tt2 = time.mktime(time.localtime()) print(tt2) ''' 1677556220.0 '''
# 时间元组<===>格式化时间 相互转换 # 1-时间元组转换为格式化时间 tt3 = time.localtime() print(time.strftime("%Y-%m-%d %H:%M:%S".format(tt3))) ''' 2023-02-28 13:52:02 ''' # 2-格式化时间转换为时间元组 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) '''
# 时间戳<===>格式化时间 相互转换 # 1-格式化时间转换为时间戳 time_format = "2023-02-28 19:11:56" # 先将格式化时间转换为时间元组 time_stamp1 = time.strptime(time_format, "%Y-%m-%d %H:%M:%S") # 再将时间元组转换为时间戳 tt7 = time.mktime(time_stamp1) print(tt7) ''' 1677582716.0 ''' # 2-时间戳转换为格式化时间 time_stamp2 = 1677582716.0 tt8 = time.strftime("%Y-%m-%d %H:%M:%S".format(time_stamp2)) print(tt8) ''' 2023-02-28 19:11:56 '''
2. Gemeinsame Methoden oder Attribute der Datumsklasse
Die Datumsklasse enthält drei Parameter: nämlich: Jahr, Monat, Tag. Das Rückgabeformat ist Jahr-Monat-Tag.
# 指定类型时间转换为时间字符串 # 1-时间元组转换为时间字符串 tt5 = time.asctime(time.localtime()) print(tt5) ''' Tue Feb 28 11:51:05 2023 ''' # 2-时间戳转换为时间字符串 timestamp = 1677582279.0 tt6 = time.ctime(timestamp) print(tt6) ''' Tue Feb 28 11:51:05 2023 '''
import datetime # 设置指定日期 set_date = datetime.date(day=1, month=3, year=2025) print(set_date)# 2025-03-01
# 获取今天日期的年份、月份、日 today = datetime.date.today() print("标准日期格式:", today.isoformat())# 标准日期格式: 2023-03-01 print("当前日期的三元元祖: 年、第几周、一周的第几天:", today.isocalendar())# 当前日期的三元元祖: 年、第几周、一周的第几天: (2023, 9, 3) print("当前日期:", today)# 当前日期: 2023-03-01 print("当前年月日:", today.today())# 当前年月日: 2023-03-01 print("当前年份:", today.year)# 当前年份: 2023 print("当前月份:", today.month)# 当前月份: 3 print("当前日:", today.day)# 当前日: 1
t = datetime.time(hour=12, minute=59, second=59, microsecond=59)# 实例化time对象,传入时、分、秒、微秒 print("当前时间:", t)# 当前时间: 12:59:59.000059 # 常用属性 print("时:", t.hour)# 时: 12 print("分:", t.minute)# 分: 59 print("秒:", t.second)# 秒: 59 print("微秒:", t.microsecond)# 微秒: 59 print("最大时间:", t.max)# 最大时间: 23:59:59.999999 print("最小时间:", t.min)# 最小时间: 00:00:00
t = datetime.time(hour=12, minute=59, second=59, microsecond=59)# 实例化time对象,传入时、分、秒、微秒 print("当前时间:", t)# 当前时间: 12:59:59.000059 # 常用方法 print("返回格式化时间:", t.isoformat())# 格式化时间: 12:59:59.000059 print("从格式化时间转换:", t.fromisoformat('12:00:00'))# 从格式化时间转换: 12:00:00 print("转换为格式化时间:", t.strftime("%Y-%m %H:%M:%S"))# 转换为格式化时间: 1900-01 12:59:59
dt = datetime.datetime.now()# 实例化datetime类 print("当前日期:", dt)# 当前日期: 2023-03-01 15:17:00.350579 # 常用属性 print("当前年份:", dt.year)# 当前年份: 2023 print("当前月份:", dt.month)# 当前月份: 3 print("当前日:", dt.day)# 当前日: 1 print("时:", dt.hour)# 时: 15 print("分:", dt.minute)# 分: 17 print("秒:", dt.second)# 秒: 0 print("微秒:", dt.microsecond)# 微秒: 350579 print("最大时间:", dt.max)# 最大时间: 9999-12-31 23:59:59.999999 print("最小时间:", dt.min)# 最小时间: 0001-01-01 00:00:00
dt = datetime.datetime.now()# 实例化datetime类 print("当前日期:", dt)# 当前日期: 2023-03-01 15:17:00.350579 # 常用方法 print("今天日期时间:", dt.today())# 今天日期时间: 2023-03-01 15:23:55.703063 print("当前日期:", dt.date())# 当前日期: 2023-03-01 print("当前日期时间的格式化输出:", dt.isoformat())# 当前日期时间的格式化输出: 2023-03-01T15:23:55.703063 print("当前日期的三元组:", dt.isocalendar())# 当前日期的三元组: (2023, 9, 3) print("当前日期一周中的第几天:", dt.isoweekday())# 当前日期一周中的第几天: 3 print("从指定日期时间转换并格式化输出:", dt.fromisoformat("2023-02-28 19:11:56"))# 从指定日期时间转换并格式化输出: 2023-02-28 19:11:56 print("从指定时间戳转换并格式化输出:", dt.fromtimestamp(1677644920))# 从指定时间戳转换并格式化输出: 2023-03-01 12:28:40 print("从三元组转换并格式化输出:", dt.fromisocalendar(year=2025, week=4, day=2))# 从三元组转换并格式化输出: 2025-01-21 00:00:00
datetime.timedelta() 类可以传递多个参数,用来表示时间间隔,返回形式为标准时间格式:0:00:00
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 模块提供了多种方法,可以用来测量 Python 小段代码执行时间。它既可以在命令行界面直接使用,也可以通过导入模块进行调用。
timeit 模块定义了三个实用函数和一个公共类,分别为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)
从上述源码中可以看出,无论是timeit还是repeat方法,都是先生成Timer对象,然后调用了Timer对象的timeit或repeat函数。
timeit.timeit(stmt='pass', setup='pass', timer=
, number=1000000)
创建一个 Timer 实例,参数分别是:
注:由于 timeit() 正在执行语句,语句中如果存在返回值的话会阻止 timeit() 返回执行时间。timeit() 会取代原语句中的返回值。
"""timeit()方法""" # 统计代码运行时间 # stmt:要测试的代码,setup:初始化导入语句、要传入的变量属性等 tm1 = timeit.timeit(stmt="[i**2 for i in testlist]", setup="testlist=range(1000)", number=3)# 统计代码运行时间 print(tm1)# 0.0007954000000000017 # 统计代码运行时间,setup为复合语句 tm2 = timeit.timeit(stmt="[i**2 for i in testlist]", setup="a=1000;testlist=range(a)", number=3)# 统计代码运行时间 print(tm2)# 0.0007886000000000282
timeit.repeat(stmt='pass', setup='pass', timer=
, repeat=3, number=1000000)
创建一个 Timer 实例,参数分别是:
"""repeat()方法""" # 统计代码运行时间,重复两次,返回结果为列表 # stmt:要测试的代码,setup:初始化导入语句、要传入的变量属性等 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] # 统计代码运行时间,setup为复合语句 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()默认的计时器,一般是 time.perf_counter(),time.perf_counter() 方法能够在任一平台提供最高精度的计时器(它也只是记录了自然时间,记录自然时间会被很多其他因素影响,例如计算机的负载)。
timeit.Timer是计算小段代码执行速度的类:
timer = timeit.Timer(stmt='pass', setup='pass', timer=
timer.timeit(number=10)
timer.repeat(number=10, repeat=5)
构造函数需要的参数有:
前两个参数的默认值都是 'pass',timer 参数是平台相关的;前两个参数都可以包含多个语句,多个语句间使用分号(;)或新行分隔开。
第一次测试语句的时间,可以使用 timeit() 方法;repeat() 方法相当于持续多次调用 timeit() 方法并将结果返回为一个列表。
stmt 和 setup 参数也可以是可供调用但没有参数的对象,这将会在一个计时函数中嵌套调用它们,然后被 timeit() 所执行。注意,由于额外的调用,计时开销会相对略到。
"""Timer类""" timer = timeit.Timer(stmt="[i**2 for i in testlist]", setup="a=1000;testlist=range(a)") # 调用timeit方法 print(timer.timeit(number=3))# 0.0008310999999999735 # 调用repeat方法,返回一个时间列表 print(timer.repeat(number=3, repeat=3))# [0.0007549000000000028, 0.0007492000000000054, 0.0007519999999999749]
通过"python -m timeit -h"查看帮助信息:
Tool for measuring execution time of small code snippets.
用于测量小代码片段执行时间的工具。
This module avoids a number of common traps for measuring execution
mal. Siehe auch Tim Peters' Einführung in das Kapitel „Algorithmen“ im „Python Cookbook“, veröffentlicht von O'Reilly.
Dieses Modul vermeidet viele häufige Fallstricke bei der Messung von Ausführungszeiten. Siehe auch das Python-Kochbuch von Tim Peters, herausgegeben von O'Reilly.
Bibliotheksnutzung: siehe die Timer-Klasse.
Bibliotheksnutzung: siehe die Timer-Klasse.
Befehlszeilenverwendung:
Befehlszeilenverwendung:
python timeit.py [-n N] [-r N] [-s S] [-p] [-h] [--] [Anweisung]
Optionen: Option:
-n/--number N: wie oft „Anweisung“ ausgeführt werden soll (Standard: siehe unten)
-r/--repeat N: wie oft der Timer wiederholt werden soll (Standard 5)
-s/--setup S: Anweisung, die anfänglich einmal ausgeführt wird (Standard „pass“).
Die Ausführungszeit dieser Setup-Anweisung ist NICHT zeitlich festgelegt.
-p/--process: verwende time.process_time() ( Standard ist time.perf_counter())
-v/--verbose: rohe Timing-Ergebnisse ausgeben; für mehr Zifferngenauigkeit wiederholen
-u/--unit: Ausgabezeiteinheit festlegen (nsec, usec, msec oder sec). )
-h/--help: Diese Nutzungsmeldung ausgeben und beenden
--: Optionen von der Anweisung trennen, verwenden, wenn die Anweisung mit -
statement beginnt: Anweisung, die zeitlich festgelegt werden soll (Standard „pass“)
Ein Multi -Zeilenanweisungen können angegeben werden, indem jede Zeile als separates Argument angegeben wird. Eingerückte Zeilen sind möglich, indem ein Argument in Anführungszeichen gesetzt wird und mehrere -s-Optionen ähnlich behandelt werden. Mehrzeilige Anweisungen Durch Angabe jeder Zeile als eigenständiges Argument können eingerückte Zeilen erstellt werden, indem Argumente in Anführungszeichen gesetzt und führende Leerzeichen verwendet werden. Das Einschließen mehrerer -s-Optionen wird auf ähnliche Weise gehandhabt.
Wenn -n nicht angegeben ist, wird eine geeignete Anzahl von Schleifen berechnet, indem aufeinanderfolgende Zehnerpotenzen ausprobiert werden, bis die Gesamtzeit mindestens 0,2 Sekunden beträgt.
Hinweis: Mit der Ausführung einer
pass-Anweisung ist ein gewisser Grundaufwand verbunden. Der Code hier versucht nicht, ihn zu verbergen, aber Sie sollten sich dessen bewusst sein
gemessen durch Aufrufen des Programms ohne Argumente.
Hinweis: Pass-Anweisung ausführen. Es variiert zwischen den Versionen. Der Code hier versucht nicht, ihn zu verbergen, aber Sie sollten sich dessen bewusst sein. Der Basis-Overhead kann gemessen werden, indem das Programm ohne Parameter aufgerufen wird.
Klassen:
Timer
Funktionen:
timeit(string, string) -> float
repeat(string, string) -> list
default_timer() -> float
Spezifische Verwendung:
python timeit .py [-n N] [-r N] [-s S] [-p] [-h] [--] [Anweisung]
Die Bedeutung jeder Option:
Optionen
Bedeutung | -n N | --number=NDie Häufigkeit Die Anweisung wird ausgeführt |
-r N | --repeat=N | Anzahl der Wiederholungen des Tests (Standard 5 Mal) |
-s. S | --setup= S | Zunächst ausgeführte Anweisungen, wie zum Beispiel: Variablen, Eigenschaften usw., die übergeben werden sollen |
-p | --process | Messen Sie die Prozesszeit anstelle der tatsächlichen Ausführung Zeit (verwenden Sie time.process_time( ) anstelle von Standard time.perf_counter()) |
-v | --verbose | druckt rohe Zeitergebnisse; wiederholen Sie den Vorgang für mehr numerische Präzision |
-u | --unit | Stellen Sie die Ausgabezeiteinheit ein (nsec, usec, msec oder sec) |
-h | - Hilfe mit | Statement
|
Die zu messende Anweisung (Standard ist „bestanden“) |