[英]Python timeit not working?
有人可以解釋一下為什么會這樣嗎?
aatiis@aiur ~ $ time python /usr/lib64/python2.7/timeit.py -n 1 \
-- 'x = 10**1000'
1 loops, best of 3: 0.954 usec per loop
real 0m0.055s
user 0m0.050s
sys 0m0.000s
aatiis@aiur ~ $ time python /usr/lib64/python2.7/timeit.py -n 1 \
-- 'x = 10**100000'
1 loops, best of 3: 0.954 usec per loop
real 0m0.067s
user 0m0.040s
sys 0m0.020s
aatiis@aiur ~ $ time python /usr/lib64/python2.7/timeit.py -n 1 \
-- 'x = 10**10000000'
1 loops, best of 3: 0.954 usec per loop
real 0m20.802s
user 0m20.540s
sys 0m0.170s
我從timeit
得到完全相同的結果,但time
告訴我,評估10**10000000
需要超過20秒。 如果我從解釋器調用timeit
,也會發生同樣的情況:
>>> t = time.time()
>>> print timeit.timeit('x = 10**10000000;', number=1)
5.00679016113e-06
>>> print time.time() - t
20.6168580055
為什么我的timeit
不工作,或者我究竟做錯了什么?
附加信息:
>>> print sys.version
2.7.1+ (2.7:4f07cacb2c3b+, Mar 28 2011, 23:11:59)
[GCC 4.4.5]
>>> print sys.version_info
>>> sys.version_info(major=2, minor=7, micro=2, releaselevel='alpha', serial=0)
更新:
這是另一個非常有趣的觀察:
>>> def run():
... t = time.time()
... x = 10**10000000
... print time.time() - t
當我在定義此功能后按Enter鍵時,大約需要半分鍾才能返回提示。 接着:
>>> run()
2.14576721191e-06
為什么會這樣? 函數體是以某種方式預編譯或優化的嗎?
我的猜測是,問題是出在你是如何陳述的問題timeit
。 我認為正在發生的事情是,在編譯測試表達式時,表達式將被評估一次,然后只使用每個timeit循環查看(而不是重新評估)。 因此,目前您所測量的只是進行分配而不是計算所需的時間。
你需要強制計算每次都發生:
timeit.timeit('x = 10; y = 100; z = x ** y')
編輯:在回答您以后的問題時,正在優化功能體。 編譯器看到10*100000
並意識到它不會改變,所以在編譯時而不是運行時計算它。
相比:
>>> import dis
>>> def run():
... return 10**100
...
>>> dis.dis(run)
3 0 LOAD_CONST 3 (100000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000L)
3 RETURN_VALUE
和
>>> def runvar():
... x = 10
... return x**100
...
>>> dis.dis(runvar)
3 0 LOAD_CONST 1 (10)
3 STORE_FAST 0 (x)
4 6 LOAD_FAST 0 (x)
9 LOAD_CONST 2 (100)
12 BINARY_POWER
13 RETURN_VALUE
請注意, BINARY_POWER
僅在第二種情況下在運行時執行。 所以timeit
表現得應該如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.