使用try除了在python中 - 成本是多少?

时间:2014-12-04 13:36:46

标签: python performance try-except

我正在读取一个文件并使用try catch来捕获数据可能不是我正在寻找的类型的情况:

for w in text.readlines():
    try:
        new = float(w.split()[3].replace(',', '.'))
        if new < temp and w.split()[1][3:5] == '12':
            temp = new
            date = w
    except ValueError:
        ''
    except IndexError:
        ''

这实际上是一个hacky解决方案,不是我会使用的东西,只是我写的东西,因为我需要快速访问一些数据。但是,如果我想解析一个非常大的文件或流,那么这样的解决方案(修改以便更智能地调用等)是可行的,或者应该选择其他解决方案。我的主要问题是关于try catch的性能,是否是一个昂贵的操作,并且是否有良好的try-except使用指南?希望这个问题不是太宽泛。如果是的话,请关注我的例子。

2 个答案:

答案 0 :(得分:1)

我不能说太多,因为我不是专家,但在任何编码语言中使用try except会更好,因为您似乎代码可能会产生一些错误,并且在python词汇表中 EAFP规则清楚地说明了这一点。

比许可更容易请求宽恕。这种常见的Python编码风格假设存在有效的键或属性,并且如果假设被证明是错误则捕获异常。这种干净和快速的风格的特点是存在许多try和except语句。该技术与许多其他语言(例如C。

)共有的LBYL风格形成对比
for w in text.readlines():
    try:
        new = float(w.split()[3].replace(',', '.'))
        if new < temp and w.split()[1][3:5] == '12':
            temp = new
            date = w
    except ValueError:
        Do Something
    except IndexError:
        Do Something
    except Exception: #Exception is a Base class of all exceptions if any exception that isn't catch will go in it,
        Do Something

答案 1 :(得分:1)

在您给出的特定示例中,您可以轻松地测试并避免IndexError案例,因此我会进行该测试。 ValueError更难检查,因此您应该捕获异常。

for w in text:
    words = w.split()
    if len(words) >= 4:
        try:
            new = float(words[3].replace(',', '.'))
            if new < temp and words[1][3:5] == '12':
                temp = new
                date = w
        except ValueError:
            pass

不要在文件上使用readlines(),而应该只是迭代文件。

如果在检查之前检查或处理异常同样容易,那么一个好的经验法则是考虑抛出异常的频率。如果在正常情况下异常触发非常罕见,那么只需处理它,另一方面如果它是常见的情况,那么最好避免抛出它。由于我对您的数据一无所知,因此我不知道有多少行会少于4个字段,因此在这种情况下选择非常随意。