【发布时间】:2018-10-02 15:26:31
【问题描述】:
考虑一个返回一半浮点参数的函数。是第一个好还是第二个更好?
def half_a(x: float) -> float:
return x / 2
def half_b(x: float) -> float:
return x / 2.0
是否有任何性能差异,或者是否有一种风格约定会说其中一个比另一个更好?
显然half_a 看起来更好,更复杂的代码段可能会变得更易读,但在其他一些语言中,使用half_b 版本以避免运行时类型转换是必要的或更可取的。
【问题讨论】:
-
是的,第二种方式更好。但是第一种方式是可以容忍的。
-
我秒秒
-
我现在选择第一个。 Python 2 需要第二种方法来保证使用了浮点除法,但是在 Python 3 的
/运算符和类型注释之间,我更喜欢整数分母来强调你正在除以 exactly i> 2,而不是在某个浮点容差范围内等于 2 的某个数字。 -
整数 2 将完全转换为 2.0,但它必须在每次调用时由
float.__div__转换。当然,这是一个非常便宜的转换,老实说,我不确定它是否涉及创建 Python 浮点对象,或者它发生在 C 级别,避免创建新的 Python 对象。如果你真的想在这里对性能进行微优化,请避免缓慢的 Python 函数调用。并使用x * 0.5而不是x / 2.0; 0.5 也精确地表示为浮点数,因为它是小二进制幂的小倍数。 -
@Ivan 乘法比除法稍微简单一些。一方面,它不必处理除以零。在古代,CPU的乘法肯定比除法快。我不知道这些天是否有明显的差异,如果有,是否与 CPython 有关,但旧习惯很难改掉。 :)
标签: python performance floating-point coding-style