我是Python 3学习者,最近我对time.time()的奇怪行为感到困惑。
我写了两段代码并用time.time()来计时:
pow
版本from time import time
t0 = time()
x = pow(2, 1000000000)
t1 = time()
print(t1 - t0)
**
版本from time import time
t0 = time()
x = 2 ** 1000000000
t1 = time()
print(t1 - t0)
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))
答案 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
文件很小。