使用time.time()作为定时器失败的'**`

时间:2017-09-03 02:58:48

标签: python python-3.x

我是Python 3学习者,最近我对time.time()的奇怪行为感到困惑。

我写了两段代码并用time.time()来计时:

pow版本

from time import time

t0 = time()
x = pow(2, 1000000000)
t1 = time()
print(t1 - t0)
  

powimage

**版本

from time import time

t0 = time()
x = 2 ** 1000000000
t1 = time()
print(t1 - t0)
  

**image

pow:time_cost = 1.544sec,输出= 1.43625617027

**:time_cost = 1.526sec,output = 0.0

为什么time.time()不适用于**版???

更多信息:

内容sys.version = '3.6.2 (v3.6.2:5fd33b5, Jul 8 2017, 04:14:34) [MSC v.1900 32 bit (Intel)]'

sys.winver = '3.6-32'

sys.platform = 'win32'

sys.implementation = namespace(cache_tag='cpython-36', hexversion=50725616, name='cpython', version=sys.version_info(major=3, minor=6, micro=2, releaselevel='final', serial=0))

1 个答案:

答案 0 :(得分:3)

它与Python 3在处理文件时处理某些常量表达式的方式有关。如果您运行该程序:

print("start")
x = 2**1000000000
print("end")

你会看到有一个很长的启动延迟,然后"开始"和"结束"几乎同时印刷。该计划:

print("start")
x = pow(2, 1000000000)
print("end")

打印"开始",然后暂停一段时间,打印"结束"。

Python"预先计算"在程序实际开始运行之前,表达式2**1000000000在它最初处理文件时(在字节编译阶段)。相反,表达式pow(2,1000000000)不是预先计算的;它的字节编译为函数调用,并在程序实际运行时计算。

以下是另一种看待这种情况的方法。如果您创建两个模块文件:

# starstar.py
x = 2**1000000000

# pow.py
x = pow(2,1000000000)

并将它们导入另一个程序:

# main.py
import starstar
import pow

并运行python main.py,然后Python将生成模块的字节编译版本(可能在名为__pycache__或其他东西的子目录中)。您将看到starstar.pyc模块的字节编译版本很大 - 它实际上包含预先计算的2**1000000000值的副本;但pow.pyc文件很小。