Python中的exception处理程序的代价
在另一个问题中 ,接受的答案build议用try / except块replacePython代码中的(非常便宜的)if语句以提高性能。
除了编码风格的问题,假设exception没有被触发,它有多less差异(性能方面)有一个exception处理程序,而不是一个,而不是一个比较为零的if语句?
你为什么不使用timeit
模块来测量它? 这样你可以看到它是否与你的应用程序相关。
好的,所以我刚刚尝试了以下内容:
import timeit statements=["""\ try: b = 10/a except ZeroDivisionError: pass""", """\ if a: b = 10/a""", "b = 10/a"] for a in (1,0): for s in statements: t = timeit.Timer(stmt=s, setup='a={}'.format(a)) print("a = {}\n{}".format(a,s)) print("%.2f usec/pass\n" % (1000000 * t.timeit(number=100000)/100000))
结果:
a = 1 try: b = 10/a except ZeroDivisionError: pass 0.25 usec/pass a = 1 if a: b = 10/a 0.29 usec/pass a = 1 b = 10/a 0.22 usec/pass a = 0 try: b = 10/a except ZeroDivisionError: pass 0.57 usec/pass a = 0 if a: b = 10/a 0.04 usec/pass a = 0 b = 10/a ZeroDivisionError: int division or modulo by zero
所以,正如所料,没有任何exception处理程序稍微快一些(但发生exception时会爆炸),并且只要条件不满足, try/except
比明确的更快。
但是,这一切都在相同的数量级,不可能两者都是重要的。 只有在条件得到满足的情况下, if
版本才会更快。
这个问题实际上是在“ devise和历史常见问题解答”
如果没有引发exception,try / except块是非常有效的。 其实捕捉exception是昂贵的。
这个问题是误导性的。 如果您认为exception不会被触发,那么这两个代码都不是最佳代码。
如果您认为exception是作为错误条件的一部分而触发的,那么您已经超出了想要最优代码的范围(并且您可能没有像这样的细粒度级别处理它)。
如果你使用exception作为标准控制stream程的一部分 – 这是Pythonic“请求宽恕,不允许”的方式 – 那么exception将被触发,成本取决于exception的types,如果,以及估计发生exception的时间百分比。