在Python中,像10**9
文字一样的表达式也是文字吗?我要问的是:在经常被调用且应该是轻量级的代码中使用表达式而不是有意义但可计算性较低的文字会有成本吗?
没有性能成本.考虑一下:
import dis def foo(): x = 10**9 y = 10**9 def bar(): x = 1000000000 y = 1000000000 dis.dis(foo) dis.dis(bar)
产量
In [6]: dis.dis(foo) 5 0 LOAD_CONST 3 (1000000000) 3 STORE_FAST 0 (x) 6 6 LOAD_CONST 4 (1000000000) 9 STORE_FAST 1 (y) 12 LOAD_CONST 0 (None) 15 RETURN_VALUE In [8]: dis.dis(bar) 9 0 LOAD_CONST 1 (1000000000) 3 STORE_FAST 0 (x) 10 6 LOAD_CONST 1 (1000000000) 9 STORE_FAST 1 (y) 12 LOAD_CONST 0 (None) 15 RETURN_VALUE
因此,当Python编译代码时,它会更改10**9
为1000000000
.运行字节码时,使用10**9
或没有区别1000000000
.
它更多的是可读性和编码风格.通过编写类似10**9
的替代1000000000
或等等,你会让你的代码更短,更易读,因而其维护和改进会更容易.如果你想10**9
在代码中多次使用,作为一种更优雅的方式,你最好将它用作模块顶层的全局变量,这样更优雅.喜欢:
MY_VARIABLE = 10**9
请注意,即使您不使用全局变量名称并通过代码使用其数值,python也会假设它是一个常量值,并且不会每次都重新计算它.
例如,正如您在下面的字节码中看到的那样,python将加载常量值(您在第一部分中定义a
),c
并且不会为此创建新对象1:
>>> def test(): ... a = 10**9 ... b = 1000000000 ... c = 10**9 ... >>> dis.dis(test) 2 0 LOAD_CONST 4 (1000000000) 3 STORE_FAST 0 (a) 3 6 LOAD_CONST 3 (1000000000) 9 STORE_FAST 1 (b) 4 12 LOAD_CONST 5 (1000000000) 15 STORE_FAST 2 (c) 18 LOAD_CONST 0 (None) 21 RETURN_VALUE
请注意,python小整数是单例,python只会创建它们的一个副本(-5到256).