在Python中,像10**9
这样的表达式是由文字组成的文字吗?我要问的是:在经常调用并且应该是轻量级的代码中使用表达式而不是有意义但可计算性较低的文字会有成本吗?
答案 0 :(得分:13)
没有性能成本。考虑一下:
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
之间没有区别。
答案 1 :(得分:6)
更多的是可读性和编码风格。通过编写10**9
而不是1000000000
等内容,您可以使代码更短,更易读,从而使维护和改进更容易。如果你想在你的代码中多次使用10**9
,作为一种更优雅的方式,你最好将它用作模块顶层的全局变量,这样更优雅。像:
MY_VARIABLE = 10**9
注意即使您不使用全局变量名并通过代码python使用其数值,也会假设它是一个常量值,并且不会每次重新计算它。
例如,正如您在下面的字节码中看到的那样,python将为a
加载常量值(您在c
的第一部分中定义)并且不会创建新对象< sup> 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)。 子>
答案 2 :(得分:1)
经过自我反思后,我做了一些时间测量:
>>> import timeit
>>> def f():
... return 10**9
>>> timeit.timeit(f)
0.13885498046875
>>> def f():
... return 1000000000
>>> timeit.timeit(f)
0.13900208473205566
答案 3 :(得分:1)
是使用表达式的成本,即由Python precomputing constant expressions引起的性能成本,但在大多数情况下这个成本不太可能明显,例如{{{} 1}},更像是10**9
等案例。