2013-05-08 25 views
0

我有下面的代碼:爲什麼兩個相同的python代碼塊需要完成不同的時間量?

from mmap import mmap 
from struct import unpack 
from time import time,sleep 

mmap_offset  =0x44c00000 
mmap_size  =0x48ffffff-mmap_offset 
DCAN1   =0x481D0000-mmap_offset #DCAN1 registers TIRM 2.1 
DCAN1_IF1CMD =0x100+DCAN1 

with open("/dev/mem", "r+b") as f: 
    testMap=mmap(f.fileno(),mmap_size,offset=mmap_offset) 


start1=time() 
unpacked1=unpack("<L",testMap[DCAN1_IF1CMD:DCAN1_IF1CMD+4])[0] 
end1=time() 

start2=time() 
unpacked2=unpack("<L",testMap[DCAN1_IF1CMD:DCAN1_IF1CMD+4])[0] 
end2=time() 


print end2-start2,end1-start1 

其中重複地(以幾微秒內)給了我下面的輸出:

3.00407409668e-05 0.0001220703125 

我不知道在哪裏,這是來自和真的很想明白。有什麼想法嗎?下面是我的版本和CPU信息。

Linux version 3.2.34 ([email protected]) (gcc version 4.5.4 20120305 (pre 
release) (GCC)) #1 Wed Nov 21 14:17:11 CET 2012 

Processor  : ARMv7 Processor rev 2 (v7l) 
BogoMIPS  : 718.02 
Features  : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls 
CPU implementer : 0x41 
CPU architecture: 7 
CPU variant  : 0x3 
CPU part  : 0xc08 
CPU revision : 2 

Hardware  : am335xevm 
Revision  : 0000 
Serial   : 0000000000000000 

編輯: 我已經更新的代碼重新運行該塊10倍以下方式:

for i in xrange(10): 
    start2=time() 
    unpacked2=unpack("<L",testMap[DCAN1_IF1CMD:DCAN1_IF1CMD+4])[0] 
    end2=time() 
    print end2-start2 

導致:

9.20295715332e-05 
6.103515625e-05 
3.00407409668e-05 
3.09944152832e-05 
3.09944152832e-05 
3.00407409668e-05 
3.09944152832e-05 
3.09944152832e-05 
2.98023223877e-05 
3.09944152832e-05 

看來定居在3e-05 ......我是否運行它10次或100次。

+0

也許這是一個初始化/緩存問題。順便說一句,我不能重現這一點。我的輸出是'0.0014169216156 0.00145888328552'。 – Alfe 2013-05-08 20:59:44

+0

如果您執行該代碼超過兩次會發生什麼?第三次,第四次,第五次和第一百次執行的持續時間是多少? – Alfe 2013-05-08 21:02:14

+0

@Alfe,我已經用相關信息更新了代碼,看起來好像它在30美元左右穩定 – Chris 2013-05-10 17:55:29

回答

1

最可能的重複加速是由於緩存效果低於Python級別的某處,即Python解釋器(可能帶有像pypy這樣的JIT),底層庫(libc,stdlib,...),甚至是處理器緩存。

相關問題