快速Pythonic方法将许多字符串列表转换为浮点数列表,同时捕获ValueErrors

我在Python中有大约5000万个字符串列表,如下所示:

["1", "1.0", "", "foobar", "3.0", ...]

我需要将这些转换为浮动列表和Nones,如下所示:

[1.0, 1.0, None, None, 3.0, ...]

目前我使用的代码如下:

def to_float_or_None(x):
    try:
        return float(x)
    except ValueError:
        return None

result = []
for record in database:
    result.append(map(to_float_or_None, record))

to_float_or_None函数总共花费大约750秒(根据cPro​​file)…有没有更快的方法来执行从字符串列表到浮点数/ Nones列表的转换?

更新
我已经将to_float_or_None函数确定为主要瓶颈.我无法在使用地图和使用列表推导之间找到显着的速度差异.
我应用了Paulo Scardine的提示来检查输入,它已经节省了1/4的时间.

def to_float_or_None(x):
    if not(x and x[0] in "0123456789."):
        return None
    try:
        return float(x)
    except:
        return None

发电机的使用对我来说是新的,所以感谢您提示Cpfohl和Lattyware!这确实加快了文件的读取速度,但我希望通过将字符串转换为浮点数/ Nones来节省一些内存.

最佳答案
到目前为止给出的答案并没有完全回答这个问题.尝试…捕获与验证,如果然后可以导致不同的性能(见:https://stackoverflow.com/a/5591737/456188).总结答案:取决于失败与成功的比率以及两种情况下失败和成功的测量时间.基本上我们不能回答这个,但我们可以告诉你如何:

>查看一些代表性案例以获得比率.
>编写一个if / then,测试与try / catch优化相同,然后测量两个版本的to_float_or_None失败100次所需的时间,并测量两个版本的to_float_or_None成功完成100次所需的时间.
>做一点数学计算,找出哪个会更快.

关于列表理解问题的旁注:

根据您是否希望能够对其结果进行索引,或者您是否只想迭代它,生成器表达式实际上甚至比列表理解更好(只需将[]字符替换为()字符).

它基本上没有时间来创建,并且to_float_or_None(这是一个昂贵的部分)的实际执行可以延迟到它需要的结果.

由于许多原因,这很有用,但如果您需要对其进行索引,则无法使用.但是,它允许您使用生成器压缩原始集合,这样您仍然可以访问原始字符串及其float_or_none结果.

转载注明原文:快速Pythonic方法将许多字符串列表转换为浮点数列表,同时捕获ValueErrors - 代码日志