python中测量时间的异常结果

python中测量时间的异常结果,python,performance,time,Python,Performance,Time,这是我的秒表课 import time class StopWatch: def __init__(self, tag="", startTime=time.time(), elapsedTime=-1): self._tag=tag self._elapsedTime=elapsedTime self._startTime=startTime # other codes here............# def

这是我的秒表课

import time

class StopWatch:

    def __init__(self, tag="", startTime=time.time(), elapsedTime=-1):
        self._tag=tag
        self._elapsedTime=elapsedTime
        self._startTime=startTime

    # other codes here............#

    def stop(self, tag=None):
        if tag is not None:
            self._tag = tag
        self._elapsedTime = time.time() - self._startTime
        return self

    def getStartTime(self):
        return self._startTime
秒表测试文件为:

import unittest
import time
from metric.StopWatch import StopWatch

class StopWatchTest(unittest.TestCase):

    def test_stopwatch(self):
        now=time.time()
        print "now:%f" % now

        stopwatch=StopWatch("firstHook")
        print "start time:%r" % stopwatch.getStartTime()
        self.assertTrue(stopwatch.getStartTime()>now, "start time is wrong")
我得到的是错误:

now:1364791630.047630
start time:1364791629.158797


稍后执行的代码显示的是较早的时间。这背后的原因是什么?

原因是这一行:

def __init__(self, tag="", startTime=time.time(), elapsedTime=-1):
当Python解释器到达时对其进行计算(因为尽管名称不同,它实际上编译代码,尽管是字节码)。因此,startTime是在定义类时设置的,而不是在调用
\uuuu init\uuuu
时设置的

将其更改为:

def __init__(self, tag="", start_time=None, elapsed_time=-1):
    if start_time is None:
        start_time = time.time()
    self._tag=tag
    self._elapsed_time=elapsed_Time
    self._start_time=start_time

原因是这一行:

def __init__(self, tag="", startTime=time.time(), elapsedTime=-1):
当Python解释器到达时对其进行计算(因为尽管名称不同,它实际上编译代码,尽管是字节码)。因此,startTime是在定义类时设置的,而不是在调用
\uuuu init\uuuu
时设置的

将其更改为:

def __init__(self, tag="", start_time=None, elapsed_time=-1):
    if start_time is None:
        start_time = time.time()
    self._tag=tag
    self._elapsed_time=elapsed_Time
    self._start_time=start_time

默认参数只计算一次

def __init__(self, tag="", startTime=time.time(), elapsedTime=-1):
    self._tag=tag
    self._elapsedTime = elapsedTime
    self._startTime = startTime
要修复此问题,我们需要明确检查默认值,并在函数体中对其求值:

def __init__(self, tag="", startTime=None, elapsedTime=-1):
    self._tag=tag
    self._elapsedTime = elapsedTime
    if startTime is None:
        startTime = time.time()
    self._startTime = startTime

默认参数只计算一次

def __init__(self, tag="", startTime=time.time(), elapsedTime=-1):
    self._tag=tag
    self._elapsedTime = elapsedTime
    self._startTime = startTime
要修复此问题,我们需要明确检查默认值,并在函数体中对其求值:

def __init__(self, tag="", startTime=None, elapsedTime=-1):
    self._tag=tag
    self._elapsedTime = elapsedTime
    if startTime is None:
        startTime = time.time()
    self._startTime = startTime