欢迎光临散文网 会员登陆 & 注册

关于match-case语句和if-elif-else语句时间效率运算对比

2022-09-16 14:29 作者:Soap_mac_tavish  | 我要投稿

这不是不看不知道,一看吓一跳嘛,这不,我开始重新系统性的学习数据结构了,又回到我的老本行Python里去了,好家伙,Python 3更新的速度是真尼玛的快啊,我前脚刚学完__peg_parser__,后面又来了个本不属于Python语言的case语句,那我们就来简单分析一下这两个之间的运行时间上的差异吧!

首先,基本代码:

import time  # 导入时间库

 

count_ifs = []  # 计算每次运行if的时间

count_matchs = []  # 计算每次运行match的时间

a = 10  # 这个数还会改改

times = eval(input("Please input times: "))  # 输入程序运行次数

for i in range(times):

    begin_time = time.perf_counter_ns()  # 开始计时

    match a:

        case 1:

            pass

        case 2:

            pass

        ......  # 此处省略若干行代码

        case 9:

            pass

        case _:

            pass

    end_time = time.perf_counter_ns()  # 终止计时

    count_matchs.append(end_time - begin_time)  # 将时间差存放至count_matches列表

    begin_time = time.perf_counter_ns()

    if a == 1:

        pass

    elif a == 2:

        pass

    ......  # 此处省略若干行代码

    elif a == 9:

        pass

    else:

        pass

    end_time = time.perf_counter_ns()

    count_ifs.append(end_time - begin_time)

print("if: %d" % round(sum(count_ifs) / times))  # 输出if语句块的平均运行时间

print("match: %d" % round(sum(count_matchs) / times))  # 输出match语句块的平均运行时间

 

这个操作有效的避免了其它的语句(pass语句除外)带来的时间上的运行差异。我们只需要考虑if语句和match语句即可,该程序的缺点就是随着n的增大,代码量也随之上涨,所以这个程序,我们测到1000为止。

当a取如下整数时:

ns表示纳秒


当a = 1时,运行时间存在小于0.1 ns的误差,忽略不计。其差异不是很明显。此刻我们分析的是单分支语句

当a = 2时,运行时间存在超过1 ns的误差,可以暂时认为差异不是很明显。此刻我们分析的是双分支语句

当a = 3时,运行时间存在超过7 ns的误差,可以暂时认为差异不是很明显。此刻我们分析的是最简单的多分支语句

当a = 10时,运行时间的误差约为64 ns,这个差值也不算很庞大。

当a = 100时,运行时间的误差约为778 ns,这个差值其实也还好,连1 μs都没到。

当a = 1000时,运行时间的误差约为6413 ns,这个误差看上去就稍微有点大了,大约为6 μs。

可以发现if语句运算方面可能要比match case慢。

超过1000的我们就尽可能用循环吧,毕竟if虽然快,但这样做代码太长了。


关于match-case语句和if-elif-else语句时间效率运算对比的评论 (共 条)

分享到微博请遵守国家法律