python - 为什么对数字调用 float() 比在 Python 中添加 0.0 慢?

标签 python casting floating-point integer

在 Python 中将整数转换为 float 比将 0.0 加到该整数上慢的原因是什么?

import timeit


def add_simple():
    for i in range(1000):
        a = 1 + 0.0


def cast_simple():
    for i in range(1000):
        a = float(1)


def add_total():
    total = 0
    for i in range(1000):
        total += 1 + 0.0


def cast_total():
    total = 0
    for i in range(1000):
        total += float(1)


print "Add simple timing: %s" % timeit.timeit(add_simple, number=1)
print "Cast simple timing: %s" % timeit.timeit(cast_simple, number=1)
print "Add total timing: %s" % timeit.timeit(add_total, number=1)
print "Cast total timing: %s" % timeit.timeit(cast_total, number=1)

其输出为:

Add simple timing: 0.0001220703125

Cast simple timing: 0.000469923019409

Add total timing: 0.000164985656738

Cast total timing: 0.00040078163147

最佳答案

如果你使用 dis 模块,你可以开始了解原因:

In [11]: dis.dis(add_simple)
  2           0 SETUP_LOOP              26 (to 29)
              3 LOAD_GLOBAL              0 (range)
              6 LOAD_CONST               1 (1000)
              9 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             12 GET_ITER
        >>   13 FOR_ITER                12 (to 28)
             16 STORE_FAST               0 (i)

  3          19 LOAD_CONST               4 (1.0)
             22 STORE_FAST               1 (a)
             25 JUMP_ABSOLUTE           13
        >>   28 POP_BLOCK
        >>   29 LOAD_CONST               0 (None)
             32 RETURN_VALUE

In [12]: dis.dis(cast_simple)
  2           0 SETUP_LOOP              32 (to 35)
              3 LOAD_GLOBAL              0 (range)
              6 LOAD_CONST               1 (1000)
              9 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             12 GET_ITER
        >>   13 FOR_ITER                18 (to 34)
             16 STORE_FAST               0 (i)

  3          19 LOAD_GLOBAL              1 (float)
             22 LOAD_CONST               2 (1)
             25 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             28 STORE_FAST               1 (a)
             31 JUMP_ABSOLUTE           13
        >>   34 POP_BLOCK
        >>   35 LOAD_CONST               0 (None)
             38 RETURN_VALUE

注意 CALL_FUNCTION

Python 中的函数调用(相对)很慢。 . 查找也是如此。因为转换为 float 需要一个函数调用——这就是它变慢的原因。

关于python - 为什么对数字调用 float() 比在 Python 中添加 0.0 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35229877/

相关文章:

javascript - 如何将 Flask 的 JSON 传递给 Javascript

c++ - 我想存储指向函数的空指针及其类型

javascript - 反序列化后重新应用 JS Prototype 函数

C++ 获取句柄字符串值

c# - 仅获取 X 长度数字的前 10 个数字

C思维: float vs.整数和浮点表示

java - Java中 double 乘法的准确性?

Python datetime.strptime - ValueError : time data does not match format

python - 使用 os.environ.setdefault 安全吗?

python - 在 PIP requirements.txt 中传递 --no-deps