1、pygame.time.get_ticks()
获取pygame.init()被调用之后所经过的毫秒数,如果未调用pygame.init(),获取的数值将始终为零。
测试代码:
import pygame
pygame.init()
t0 = pygame.time.get_ticks()
t1 = pygame.time.get_ticks()
t = t1 - t0
print(t, t0, t1)
结果:
0 449 449
pygame.time.get_ticks()获取的是以毫秒为单位的、整数类型的数值,但在心理学实验中,我们往往需要精度更高的时间值(以毫秒为单位,一般取小数点后两位)。
2、time.time()
time是Python自带的标准库,该函数获取的是自1970年1月1日00:00:00 (UTC) 以来经过的秒数(注意单位是秒)。
测试代码:
import time
t0 = time.time()
t1 = time.time()
t = t1 - t0
print(t, t0, t1)
结果:
0.0 1602209599.2846003 1602209599.2846003
可以发现,就时间精度来看,pygame.time.get_ticks()甚至比不上Python自带的标准库time中的计时方法。
3、psychopy.core.getTime()
获取的是自psychopy.core模块加载以来经过的时间,以秒为单位,但精度是小于毫秒的。
测试代码:
from psychopy import core
t0 = core.getTime()
t1 = core.getTime()
t = t1 - t0
print(t, t0, t1)
结果:
1.309999788645655e-05 0.030334899995068554 0.03034799999295501
另一个相关的函数是psychopy.core.getTime(),该函数的作用是设置一个时钟,例如我们可以设置一个名为timer的时钟,接着便可以使用timer.getTime()来获取timer的时间。例如:
timer = core.Clock()
t0 = timer.getTime()
设置时钟主要有两个好处:1)可以对时钟进行更多自定义的操作,例如可以使用timer.add()在timer中填充时间,或者使用timer.reset()来重置timer的时间,等等。2)可以设置多个相互独立的时钟,以满足对多个对象进行计时的功能。
此外还有psychopy.clock.getTime()和psychopy.clock.getAbsTime()。对于前者,貌似官网上没有详细的介绍,不过应该也属于psychopy自带的一个时钟。至于后者,其功能与time.time()相同,但获取的是整数类型的数值,因此精度比time.time()稍微差一些,官方的建议是可以将这个函数获取的数值作为数据的文件名的一部分,从而创建文件名不重复的数据文件,不过我感觉与其用这个还不如用time.strftime()呢,毕竟time.strftime()的可读性更好。
小结
当使用time.sleep()、psychopy.core.wait()这样的函数来等待时间时,上述的计时函数是不会将等待时间计算在内的
pygame.time.get_ticks()和psychopy.clock.getAbsTime()获取的是整数类型(int)的时间,其它则是浮点数(float)
就时间精度而言:psychopy.core.getTime() > time.time() > pygame.time.get_ticks()
就灵活性而言,psychopy.core.getTime()是最好的
所以综合来看,在收集反应时信息时,优先使用psychopy.core.getTime(),至于pygame.time.get_ticks()则最好不要用。
----------2020.10.14更新----------
修改了psychopy部分的内容,修改了小结部分的一处错误。
Reference