gpt4 book ai didi

python - 在捕获 ValueErrors 时将许多字符串列表转换为 float 列表的快速 Pythonic 方法

转载 作者:太空宇宙 更新时间:2023-11-03 13:04:03 25 4
gpt4 key购买 nike

我有大约 5000 万个像这样的 Python 字符串列表:

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

我需要将它们变成像这样的 float 和 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 秒(根据 cProfile)...有没有更快的方法来执行从字符串列表到 float /Nones 列表的转换?

更新
我已将 to_float_or_None 函数确定为主要瓶颈。我找不到使用 map 和使用列表理解在速度上的显着差异。我使用 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 的提示!这确实加快了文件的读取速度,但我希望通过将字符串转换为 float /Nones 来节省一些内存。

最佳答案

到目前为止给出的答案并没有真正完全回答这个问题。 try...catch 与验证 if then 可能导致不同的性能(参见:https://stackoverflow.com/a/5591737/456188)。总结一下这个答案:取决于失败与成功的比率以及两种情况下失败和成功的MEASURED时间。基本上我们无法回答这个问题,但我们可以告诉您如何:

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

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

取决于你是否希望能够索引这个结果,或者你是否只想迭代它,生成器表达式实际上会比列表理解更好(只需将 [ ] 字符替换为 ( )字符)。

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

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

关于python - 在捕获 ValueErrors 时将许多字符串列表转换为 float 列表的快速 Pythonic 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9925734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com