1. reserve space for first operand:
2 already exists as a frequently-used small integer
temp1 = 1322134
temp2 = 2^(temp1)
2. reserve space for second operand:
2 already exists
13322134 already exists as temp1
2^(temp1) already exists as temp2
3. reserve space for the result:
temp3 = temp2 - temp2
Hey! That's a really easy operation!
The result is 0, which already exists as a frequently-used small integer.
i = 1322134
%timeit repr(2 ** i - 2 ** i) # 10 loops, best of 3: 24.7 ms per loop
%timeit repr(2 ** i) # 1 loop, best of 3: 6.34 s per loop # < - whoops that's slow!
注意:下面的最初解释是错误的。我把它作为一个自我教育和社区工作的例子留在这里。我是通过接受高级编译器构造的教育以及对Python内部结构的部分了解来实现的。
答错了
表达式处理程序内置了优化。减法的表达式计算器的工作方式如下:
错误答案结束
更多的实验
为了测试操作,我做了以下调整:
代码:
^{pr2}$我还测试了原始循环时间,将qqq计算替换为RHS2。用了不到一毫秒的时间。
从这一点,我观察到
结论
我最初的回答是错的。 姆塞弗特和搅拌机把它钉住了。
我把这个答案留作一个失败的反例。
实际上,我无法重现这个例子:
用了(大约)两倍的时间
^{pr2}$需要。
有一个例外-如果您“硬编码”您的值:
因为Python会在将这个“常量”转换为字节码时计算它,并且只在运行时查找它(几乎是免费的)。
您可以通过使用
dis.dis
检查Python操作:因此,
func2
执行它应该执行的所有指定操作,而func1
只加载并返回已经预先计算好的(计算是在转换时完成的!)价值观。如果你想知道为什么要花这么长时间来显示它,我认为^{}s answer 是正确的。如果您想显示某些内容,那么Python会将
repr(obj)
打印到sys.stdout
-因此有一种情况,其中1个字符(0
)转换为字符串,然后进行打印;另一种情况下,需要创建、传递和打印398002个字符。仅仅创建repr
就相当慢:慢的部分是打印数字,而不是计算它:
通过将结果存储在变量中可以看到:
^{pr2}$上面的代码将立即执行,因为Python不必在屏幕上打印出近40万个数字。
相关问题 更多 >
编程相关推荐