0

我假设 try / except 工作流程比 if / then 工作流程更快,用于简单的操作“尝试从 list_l 中删除 x”。在下面的示例中,例外失败(x 不在 list_l 中)比权限请求(如果 x 在 list_l 中)花费更多的时间,即使有 16.6% 的时间发生异常。为什么?

以下是我编写的测试及其结果:

import random, time, timeit

class Timer(object):
    def __enter__(self):
        self.start = time.time()
        return self

    def __exit__(self, *args):
        self.end = time.time()
        self.secs = self.end - self.start
        self.msecs = self.secs * 1000  # millisecs

def a_function():
    a_list = list(xrange(10))
    choice_list = list(xrange(12))
    choice = random.choice(choice_list)
    try:
        a_list.remove(choice)

    except ValueError:
        pass

def b_function():
    a_list = list(xrange(10))
    choice_list = list(xrange(12))
    choice = random.choice(choice_list)
    if choice in a_list:
        a_list.remove(choice)

with Timer() as a:
    print('test_a', timeit.timeit("a_function()", number=10000, setup="from __main__ import a_function"))

with Timer() as b:
    print('test_b', timeit.timeit("b_function()", number=10000, setup="from __main__ import b_function"))

结果:

1st attempt: ('test_a', 0.029724836349487305)('test_b', 0.027068138122558594)

2nd attempt: ('test_a', 0.02960801124572754)('test_b', 0.026785850524902344)

3rd attempt: ('test_a', 0.029654979705810547)('test_b', 0.02665996551513672)

此外,如果我将 choice_list 范围增加到 20,则差异会扩大,因为异常发生得更频繁。如果 python 强烈要求-原谅-不允许,为什么失败似乎要花费很多时间?

4

2 回答 2

6

任何语言中的异常都是非常昂贵的,这是对它们的滥用。

异常适用于您的代码无法解释且在正常操作期间不会出现的异常情况。不同的语言对异常有不同的规则,但是 16% 的时间发生的事情并不是异常的,只是不寻常的。

异常代价高昂,因为它们涉及堆栈展开和跳转、正常处理的暂停以及对处理程序的搜索。if/then 是一个标准的、正常的条件,高效且清晰。

于 2013-08-16T15:49:14.963 回答
0

这完全是在黑暗中刺伤,但这可能是由于异常处理是基于类的,而 if/then 是纯粹基于逻辑的。因此,解释器可以优化简单的条件处理,而不是对流进行分类。

http://docs.python.org/release/2.5/whatsnew/pep-352.html

于 2013-08-16T15:49:23.713 回答