Python:映射或压缩调用并忽略错误的最快方法是什么?

时间:2015-03-02 17:58:56

标签: python performance exception-handling

我经常遇到一个问题,我需要将函数应用于大型数据迭代器,但该函数有时会引发一个我想忽略的已知错误。不幸的是,列表压缩和map函数都没有很好的方法来处理错误。

在python中快速跳过/处理错误的最佳方法是什么?

例如,假设我有一个数据列表和一个函数,只要数据是str,该函数就会引发ValueError。我希望它跳过这些值。一种方法是:

result = []
for n in data:
    try: result.append(function(n))
    except ValueError: pass

你也可以做同样的事情而不进行错误检查:

result = [function(n) for n in data]

result = list(map(function, data))

我想要一种c-compiled方法来完成上述操作。

的精神
result = list(map(function, data, skip_errors=True))

default=value的功能也很有用,因此引发的错误会创建默认值。

我认为这可能是我需要编写Cython扩展名。

注意:我可以编写一个解决方案来编写我在this answer中用c或cython编写的catch函数。然后我可以在列表压缩中使用它并获得我想要的性能提升。

1 个答案:

答案 0 :(得分:0)

为什么不将函数包装在错误处理程序中?

def spam(n):
    try:
        return function(n)
    except ValueError:
        pass
result = [spam(n) for n in data]

然后,您可以在错误处理中添加任何内容(请注意,在此版本中它返回None,因此您可能希望过滤结果列表或返回默认值)。使用map也是如此。