2013-09-25 44 views
1

我有以下脚本,我测量实际经过时间forseveral睡眠函数。我使用time.sleep()来暂停程序或psychopy.core.wait(),它被认为更精确,并使用高分辨率计时器。我正在测试后者,因为wait()函数似乎会导致一些麻烦(例如,暂停程序的时间比它应该更短)。python time.clock()结果不准确,并关闭

from psychopy import core 
import time 
import scipy 
import sys 

times1 = [] 
times2 = [] 
times3 = [] 
times4 = [] 
testtime = 40 # Time to wait (40 ms) 
n = 200   # Iterations 
print "Starting timing test with", testtime, "ms as reference; running", n, "times." 

for i in range(n): 
    t1 = time.time() 
    time.sleep(testtime/1000.0) 
    measurement = (time.time()-t1)*1000 
    times1.append(measurement) 

    time.clock() 
    time.sleep(testtime/1000.0)  
    measurement = time.clock() 
    times2.append(measurement) 

    t1 = time.time() 
    core.wait(testtime/1000.0) 
    measurement = (time.time()-t1)*1000 
    times3.append(measurement) 

    t1 = time.clock() 
    core.wait(testtime/1000.0)  
    measurement = time.clock() 
    times4.append(measurement) 

    if i%60==0: 
     sys.stdout.write(".") 

print 
print "Low precision with time.sleep()" 
print "Average is", scipy.mean(times1) 
print "StdDev is", scipy.std(times1) 

print 
print "High precision with time.sleep()" 
print "Average is", scipy.mean(times2) 
print "StdDev is", scipy.std(times2) 

print 
print "Low precision with PsychoPy core.wait()" 
print "Average is", scipy.mean(times3) 
print "StdDev is", scipy.std(times3) 

print 
print "High precision with PsychoPy core.wait()" 
print "Average is", scipy.mean(times4) 
print "StdDev is", scipy.std(times4) 

我得到的输出然而这:

Starting timing test with 40 ms as reference; running 200 times. 
.... 
Low precision with time.sleep() 
Average is 39.0950024128 
StdDev is 7.77598671811 

High precision with time.sleep() 
Average is 16.2315164609 
StdDev is 9.24644085289 

Low precision with PsychoPy core.wait() 
Average is 40.830000639 
StdDev is 21.7002567107 

High precision with PsychoPy core.wait() 
Average is 16.3130358691 
StdDev is 9.24395572035 

通过time.clock返回的时间()的方式太低了!这发生在我们这里的几个系统中。

有没有人有一个想法这里发生了什么,什么可能会导致这种情况?

+0

在python3.3 +中,你可以使用'time.perf_counter'来访问高分辨率的定时器。 – Bakuriu

回答

1

您需要像做time.time()一样进行操作,并在睡觉前保存时钟值并将其减去以获得测量结果。正如你所拥有的,它的所有时钟值只是测量自处理开始以来的时间。

+0

谢谢,我虽然time.clock()返回自上次调用它的时间,然后将其内部计时器重置为0。 –