结论
在会报错的情况下,仿golang式返回报错的性能比try写法要快18%左右,
不会报错的时候仿golang式返回报错的写法仅比try式写法快1.8%左右。
(采用的算法为(a-b)/b
,其中a
>b
,b
为"比较对象
",a
为"被比较对象
")
环境
- python 3.11.5
- win10x64-22H2
- IDE: pycharm-comunity
- cpu: i5-10200H
优劣
在发生报错的情况下,仿golang式写法快一点,但必须判定明确知道返回的错误类型,不能用其父类当做判定条件;同时该写法允许在获取错误的同时获得函数的其他返回参数。
try_except式写法稍慢,except条件可以以返回错误类型的父类作为判定条件;同时该写法无法在执行函数后直接获取来自报错函数的返回内容。
题外话
显然,如果希望函数在返回报错的同时返回其他内容并且后续代码需要来自这个函数异常下返回的有效信息,则仿golang式不仅效率略高,同时也能满足该设计需求。
用例代码(分块)
定义测试运行次数
times = 100000000
try_except写法用例
def RAIS():
raise Exception()
def exc1():
try:
RAIS()
except Exception:
...
仿golang返回式写法
def RETU():
return Exception()
def exc2():
if (e:=RETU())and type(e) == Exception:
...
运行时间比较代码
import time
t=time.time()
for i in range(times):
exc1()
print("exc1 =",time.time()-t)
t=time.time()
for i in range(times):
exc2()
print("exc2 :",time.time()-t)
用例代码(完整拼接)
times = 100000000
def RAIS():
raise Exception()
def exc1():
try:
RAIS()
except Exception:
...
def RETU():
return Exception()
def exc2():
if (e:=RETU())and type(e) == Exception:
...
import time
t=time.time()
for i in range(times):
exc1()
print("exc1 =",time.time()-t)
t=time.time()
for i in range(times):
exc2()
print("exc2 :",time.time()-t)
后话
把函数RAIS()
与RETU()
中的raise
改为...
,return Exception()
改为return None
,再把times后面加个零后,用来比较无报错情况下两者的运行效率,可以得出结论:
返回式写法比try的写法要快1.8%左右,相差不大