【问题标题】:Convert integer to float将整数转换为浮点数
【发布时间】:2019-05-08 15:49:55
【问题描述】:

我正在尝试编写一个将整数转换为浮点数的函数,并将布尔值和字符串保持原样。

我定义了以下函数:

def if_int_to_float(value):

    if isinstance(value, bool):

        return value

    elif isinstance(value, int):

        return float(value)

    else:

        return value

广泛使用时,我发现此功能有点慢。有什么想法可以提高其性能/使其更 Pythonic 吗?

【问题讨论】:

  • 你说的慢是什么意思?
  • 问题:为什么首先需要这个功能?这似乎是如果你需要一个浮点数,你可以在必要时转换到float()
  • 您检查bool,但如果是,您无需执行任何特殊操作,因此您可以删除它。
  • 这段代码是作为一个更大程序的一部分运行的,在玩过 cProfile 之后,我发现这个函数调用消耗了很大一部分执行时间,即使它没有被调用太多。

标签: python integer boolean


【解决方案1】:

在传递浮点数或字符串时,您可以删除一项检查并在一行上写入以稍微提高速度。 bool 的情况已经非常快了。

Isinstance() 在这里给你带来了一些麻烦,因为 bools 也匹配 int 因此你的第一个 if 语句,所以你可以使用 type() 代替

def if_int_to_float(value):
    return value * 1.0 if type(value) == int else value

【讨论】:

  • 这就像一个魅力,让我的代码更快。谢谢!
  • 如果我可以问,你怎么知道@NicolasBerthier 这更快?同样使用type 也很糟糕,您应该始终使用isinstance 根据python 文档检查类型:docs.python.org/3/library/functions.html#type
  • 嗨,Devesh,只需通过 cProfile 运行我的代码并替换函数即可。
【解决方案2】:

试试这个:

def if_int_to_float(value):

    if type(value) == int:

        return float(value)

    else:

        return value

【讨论】:

  • 它有效,谢谢,但 Fuzzbury 的解决方案更快!
【解决方案3】:

你也许可以结合你的 if 条件。这会有所帮助,因为我们会根据输入缩短 if 条件,这样可能会使您的代码更快!

def if_int_to_float(value):

    #If not boolean and int or float, convert to float
    if not isinstance(value, bool) and isinstance(value, int) or isinstance(value,float):
        return float(value)

    #Else return value
    else:
        return value

print(if_int_to_float('a'))
print(if_int_to_float(1))
print(if_int_to_float(1.0))
print(if_int_to_float(True))

输出将是

a
1.0
1.0
True

【讨论】:

  • 它有效,谢谢,但 Fuzzbury 的解决方案更快!
  • 当然可以,我可以知道您如何判断它更快吗?也使用类型是不好的,甚至文档建议使用 isinstance
  • 感谢 Devesh,刚刚使用新函数对我的代码运行 cProfile。但是,在阅读了有关type 的更多信息后,我选择了您的解决方案。
  • 当然谢谢,之前选择的解决方案是在代码中使用了不必要的乘法,而仅仅链接 ifinstance 就足够了 :)
【解决方案4】:

也许你可以试试type() 函数并得到结果。或者您可以使用异常处理来处理此类问题。但在这种情况下,正如 cmets 中所指出的,如果是 bool 值,它会将 True 转换为 1.0 并将 False 转换为 0.0

#using type() function
def if_int_to_float(value):
    if type(value) == int:
        return float(value)
    else:
        return value

【讨论】:

  • 这会将布尔值转换为 1.0 !
【解决方案5】:

当数据在列表中时,使用lambda

data=[1,3,'j','oo']
sol = list(map(lambda x: float(x) if type(x)=='int' else x, data))
print(sol)

输出

[1.0, 3.0, 'j', 'oo']

或使用函数测试单个值

def fun_int_to_float(value):
    if type(value)=='int':
        return float(value)
    return value

【讨论】:

  • 感谢您的解决方案。我的数据不在列表中,但如果需要,我会保留它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 2019-11-25
相关资源
最近更新 更多