为什么类型注释会使 Python 代码变慢?

Ami*_*ahi 3 python performance type-hinting

这些是我在 中的测试结果ipython

\n

为了int

\n
In [2]: %time for _  in range(1000): exec(\'a: int = 4\')                                                                                                                         \nCPU times: user 12.2 ms, sys: 12 \xc2\xb5s, total: 12.2 ms\nWall time: 12.2 ms\n\nIn [3]: %time for _  in range(1000): exec(\'a = 4\')                                                                                                                              \nCPU times: user 9.5 ms, sys: 0 ns, total: 9.5 ms\nWall time: 9.54 ms\n\n
Run Code Online (Sandbox Code Playgroud)\n

对于str

\n
In [4]: %time for _  in range(1000): exec(\'a: str = "hello"\')                                                                                                                   \nCPU times: user 13.3 ms, sys: 0 ns, total: 13.3 ms\nWall time: 13.4 ms\n\nIn [5]: %time for _  in range(1000): exec(\'a = "hello"\')                                                                                                                        \nCPU times: user 10.4 ms, sys: 0 ns, total: 10.4 ms\nWall time: 10.4 ms\n
Run Code Online (Sandbox Code Playgroud)\n

也适用于list

\n
In [6]: %time for _  in range(1000): exec(\'a: list = [1,2, "hello"]\')                                                                                                           \nCPU times: user 19.1 ms, sys: 0 ns, total: 19.1 ms\nWall time: 21.5 ms\n\nIn [7]: %time for _  in range(1000): exec(\'a = [1,2, "hello"]\')                                                                                                                 \nCPU times: user 15.8 ms, sys: 0 ns, total: 15.8 ms\nWall time: 15.8 ms\n\n
Run Code Online (Sandbox Code Playgroud)\n

list我知道从理论上讲,注释不应该有任何差异int,但它们没有任何功能。但我只是测试了这些类型,以确保使用类型提示会使执行速度降低约 25%。为什么是这样?据我所知,类型提示对执行没有任何作用。只是花更多的时间来解析它们并将它们添加到__annotations__字典中就会在执行时间上产生巨大的差异吗?

\n

fla*_*kes 5

您的方法正在测试将 python 代码的原始字符串版本解释为可执行文件的编译时间。如果您将 timeit 与 fucntions 一起使用,您不会看到明显的差异:

import timeit


def method1():
    for _ in range(1000): a: int = 4


def method2():
    for _ in range(1000): a = 4


print(timeit.timeit(method1, number=200000))
print(timeit.timeit(method2, number=200000))
Run Code Online (Sandbox Code Playgroud)
2.8046581
2.8103205999999994
Run Code Online (Sandbox Code Playgroud)