我在早期的answer中读到,Python中的异常处理成本很低,所以我们不应该进行前置条件检查。
我以前没有听说过这一点,但我对Python相对比较陌生。异常处理意味着动态调用和静态返回,而if语句是静态调用和静态返回。
怎么做检查是坏的,而try-except是好的,似乎是另一种方式。有人能给我解释一下吗?
发布于 2009-02-28 15:40:16
你可能会发现这篇文章很有帮助:,Patrick Altman在那里做了一些简单的测试,看看在各种情况下的性能是什么,前提检查(在本例中是特定于字典键),并且只使用异常。如果您想要调整它来测试其他条件,也提供了代码。
他得出的结论是:
从这些结果中,我认为可以快速确定一些结论:
发布于 2009-02-28 16:05:27
不要为小事操心。您已经选择了一种速度较慢的脚本语言,因此试图向下优化到操作码对您没有太大帮助。选择像Python这样的解释型动态语言的原因是为了优化您的时间,而不是CPU的时间。
如果您使用通用语言习惯用法,那么您将看到快速原型设计和整洁设计的所有好处,并且随着Python新版本的发布和计算机硬件的升级,您的代码自然会运行得更快。
如果你有性能问题,那么分析你的代码并优化你缓慢的算法。但同时,在异常情况下使用异常,因为这将使您最终按照这些思路进行的任何重构都变得容易得多。
发布于 2009-02-28 19:50:34
抛开其他人所说的绩效衡量不谈,指导原则通常被构建为“请求宽恕比请求许可更容易”与“三思而后行”。
考虑以下两个代码片段:
# Look before you leap
if not os.path.exists(filename):
raise SomeError("Cannot open configuration file")
f = open(filename)与
# Ask forgiveness ...
try:
f = open(filename)
except IOError:
raise SomeError("Cannot open configuration file")等价物?不怎么有意思。OSes是一种多任务系统。如果文件在“exists”和“open”调用的测试之间被删除,会发生什么情况?
如果文件存在但不可读,会发生什么情况?如果它是一个目录名而不是一个文件呢?可能有许多可能的故障模式,检查所有这些模式是一项大量的工作。特别是因为'open‘调用已经检查并报告了所有这些可能的失败。
指导原则应该是减少状态不一致的可能性,而最好的方法是使用异常而不是测试/调用。
https://stackoverflow.com/questions/598157
复制相似问题