接着下面两题。
第五十三题,遍历打印任意区间耗时计算:
#编写一个程序,该程序将遍历用户指定区间内的所有整数,同时计算并输出整个遍历过程所消耗的总时间
#导入time模块
import time
#获取用户输入的区间
start = int(input('请输入区间开始值:'))
end = int(input('请输入区间结束值:'))
#定义变量保存循环开始时间(perf_counter 是单调高精度计时器,比 time.time() 更适合统计代码耗时)
start_time = time.perf_counter()
#定义变量保存遍历过程中的累加结果
total = 0
for i in range(start,end + 1):
total += i # 只计算不打印,避免控制台输出占据绝大部分耗时
#定义变量保存循环结束时间
end_time = time.perf_counter()
print('遍历过程所消耗的总时间:',end_time - start_time)
代码思路分析如下:
我的设计:还是"三明治掐表",但换了块更准的表
框架和 52 题一样:干活前按一次表、干活后按一次表,相减即耗时。这题我做了三处升级------
第一,区间交给用户。 两次 int(input()) 拿到起止值,range(start, end + 1) 现场铺名单。注意那个 + 1:range 左含右不含,不加一拍,用户输入的结束值就被漏掉了。
第二,循环体里不 print,改成累加。 52 题我发现耗时大头是屏幕输出而不是循环本身,所以这次把 print(i) 换成 total += i------循环照样满负荷转,但不产生任何 I/O,量出来才是"纯计算"的真实耗时。同时 total 变量保证了循环不是空转,累加器套路和 49 题验证码拼接一模一样。
第三,表换成了 time.perf_counter()。 time.time() 是"墙上时钟",精度一般还可能被系统时间调整干扰;perf_counter 是专门的高精度单调计时器,只为"测量经过了多久"而生,测毫秒级的代码段比 time.time() 靠谱得多。这也是我第一次体会到:同样是掐表,工具还分业余和专业。
总结
一句话:问出区间、加一拍铺名单、用累加代替打印、用专业秒表代替日历。这题让我摸到了"性能测试"的门槛------想让数字可信,就得先排除干扰项,再选对量具。
第五十四题,时间字符串转时间戳:
#给定一个表示时间的字符串,要求将其转化为以秒为单位的整数时间戳
#导入time模块
import time
#时间字符串(格式1)
a1 = '2025-4-10 23:40:00'
#使用time.strptime()将时间字符串转换为时间数组(步骤1)
time_array = time.strptime(a1, '%Y-%m-%d %H:%M:%S')
print(time_array)
#使用time.mktime()将时间数组转换为时间戳(步骤2)
timestamp = int(time.mktime(time_array))
print(timestamp)
#时间字符串(格式2)
a2 = '2025/4/10 23:40:00'
#格式同上,修改占位符格式-为/即可
time_array = time.strptime(a2, '%Y/%m/%d %H:%M:%S')
print(time_array)
timestamp = int(time.mktime(time_array))
print(timestamp)
代码思路分析如下:
我的思路:倒着走 51 题的翻译流水线
51 题我练的是"时间戳 → struct_time → 字符串"的正向翻译,这题要求反着来:拿到人读的字符串,最终产出机器读的秒数。但字符串和秒数之间没法一步到位,必须借 struct_time 当中转站,所以整个程序就是两步走:
步骤1:strptime(字符串, 格式) ------ 按图索骥拆零件。 光给字符串它不知道怎么拆,我得提供一张"模板"告诉它哪个位置是什么:%Y 四位年、%m 月、%d 日、%H:%M:%S 时分秒。strptime 照模板把字符串拆成 struct_time------函数名里的 p 就是 parse(解析),正好和 51 题的 asctime、ctime 形成反向对偶。
步骤2:mktime(struct_time) ------ 组装回时间戳。 "mk" 即 make,把零件时间制造回"自 1970 年起的秒数"。结果默认带小数,我外面套了个 int(),按题意取整。
一个细节:格式串必须和字符串"长得一模一样"
程序里我用两种格式(2025-4-10 和 2025/4/10)各走了一遍流程,代码唯一的改动是把模板里的 - 换成 /。这让我踩过点后明白:占位符的分隔符不是摆设,必须和原文严格对应------模板写 %Y-%m-%d 却喂给它 2025/4/10,strptime 会当场抛 ValueError。另外 %m、%d 对 4 这种一位数也宽容,补不补零都能认。
总结
一句话:strptime 拆、mktime 装,struct_time 当中间人。加上 51 题,时间三种形态的正反两条翻译线我总算走全了------以后不管拿到"文本时间"还是"秒数时间",都知道怎么换乘了。