返回信息流想问一下,用try except会不会使得程序运行效率下降
这是一条镜像帖。来源:北邮人论坛 / python / #1838同步于 2014/7/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
python中try except的问题
melot
2014/7/23镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
嗯,谢谢
【 在 Chon 的大作中提到: 】
: 这里有个实验,不过我还是不太能确定实验结果是否科学。
: http://www.iteye.com/topic/888986
: 发自「贵邮」
主要是它基本都不发生,所以想着不用if,用try except的话会不会快一点
【 在 nuanyangyang 的大作中提到:
: 一般的原则是exception总是慢的,如果一件事情经常发生,就不要把它当成异常。比如某些容器里的值不存在,这种情况有些时候经常发生。
再来一些测试:实际上在异常不经常发生的时候,使用异常处理比“防御性编程”更快。那个网页里的所谓“防御性编程”只判断值在不在字典里,但把取值的操作省略了,这显然是不公平的。下面是公平的测试。
# coding: utf8
import time
#统计方法执行的时间
def count_time(func):
def wrap(*args):
start = time.time()
func(*args)
end = time.time()
print "func:%s time:(%0.3f ms)" % (func.func_name, (end-start) * 1000)
return wrap
#key不存在的时候
@count_time
def not_exists_use_try(max):
dict_list = {"do_something":"...."}
for item in range(0, max):
try:
dict_list["not_exists"]
except:
pass
#key存在的时候
@count_time
def exists_use_try(max):
dict_list = {"do_something":"...."}
for item in range(0, max):
try:
dict_list["do_something"]
except:
pass
#key存在时的粗粒度策略
@count_time
def exists_use_coarse_try(max):
dict_list = {"do_something":"...."}
try:
for item in range(0, max):
dict_list["do_something"]
except:
pass
#使用防御性编码
@count_time
def not_use_try(max):
dict_list = {"do_something":"...."}
for item in range(0, max):
if "do_something" in dict_list :
pass
else:
raise Exception("I know it exists!")
#使用防御性编码,但不要把取值操作忽略了
@count_time
def not_use_try_fair(max):
dict_list = {"do_something":"...."}
for item in range(0, max):
if "do_something" in dict_list :
dict_list["do_something"]
else:
raise Exception("I know it exists!")
def run(max):
print "max:%s" % max
not_exists_use_try(max)
exists_use_try(max)
exists_use_coarse_try(max)
not_use_try(max)
not_use_try_fair(max)
if __name__ == "__main__":
run(10000000)
$ python2 exctest.py
max:10000000
func:not_exists_use_try time:(5349.390 ms)
func:exists_use_try time:(714.903 ms)
func:exists_use_coarse_try time:(577.016 ms)
func:not_use_try time:(614.677 ms)
func:not_use_try_fair time:(1012.255 ms)
用pypy试了一次(注意,测试次数增加了10倍!!!!)。一个很有意思的结果是not exists use try反而比exists use try更快。
$ pypy exctest.py
max:100000000
func:not_exists_use_try time:(798.544 ms)
func:exists_use_try time:(881.480 ms)
func:exists_use_coarse_try time:(848.676 ms)
func:not_use_try time:(911.019 ms)
func:not_use_try_fair time:(914.280 ms)
如果它基本不会发生,当然用try-except更快。
【 在 melot 的大作中提到: 】
: 主要是它基本都不发生,所以想着不用if,用try except的话会不会快一点
嗯嗯,学习了
【 在 nuanyangyang 的大作中提到: 】
: 再来一些测试:实际上在异常不经常发生的时候,使用异常处理比“防御性编程”更快。那个网页里的所谓“防御性编程”只判断值在不在字典里,但把取值的操作省略了,这显然是不公平的。下面是公平的测试。
: [code=python]
: # coding: utf8
: ...................