Windows中的Python脚本在测量点之间不占用时间

时间:2019-01-12 12:04:49

标签: python-3.x windows time file-io

我创建了一个小程序来使用套接字传输文件(客户端/服务器)。在我的发送功能中,我已经测量了执行某些任务所需的时间,以便估计传输的平均速度。

while (l):
    start_time = time.time()
    self.__sendData(l)
    acc += len(l)
    self.__setProgress(acc)
    l = f.read(1024)
    elapsed_time = time.time() - start_time
    print("longitud: " + str(len(l)))
    print("total: " + str(elapsed_time))
    self.__setSpeed(len(l), elapsed_time)

在这里您可以看到我有一个acc(累加器)变量,以便计算转移的总进度。我读取了文件的后1024个字节,并计算了执行这些操作所需的时间。我的函数__setSpeed仅使用最新的50瞬时速度来计算平均速度。

在Linux上运行正常,一点问题都没有。但是,当我在Windows中运行此命令时,发现以下输出:

enter image description here

如您所见,很多时候time for transfer and file read恰好是zero。我不明白为什么会这样,因为:

  1. 我可以想象(只是猜测)在Windows中,该文件可能会被缓冲,因此文件的readtime变为0。好吧。
  2. sendData函数的速度可能非常快,因为它的数量很少。好的,但是真的是零吗?
  3. 另外,我们应该为执行的其他命令添加一些非常少量的内容,例如控制结构,函数内部等等。

所以基本上我的问题是两个:

  1. 为什么会这样?我应该使用另一种方法进行测量吗?
  2. 哪种方法正确且适合在OS,Windows和Linux中使用?

1 个答案:

答案 0 :(得分:1)

在Windows中,time.time基于GetSystemTimeAsFileTime。我们可以使用time.get_clock_info获得此时钟的分辨率。对于系统时钟,它调用GetSystemTimeAdjustment。默认分辨率为15.625 ms:

>>> time.get_clock_info('time').resolution
0.015625

time.perf_counter应该可以解决您的问题。在Windows中,它基于QueryPerformanceCounter。为了获得此时钟的分辨率,get_clock_info调用QueryPerformanceFrequency。通常是100 ns:

>>> time.get_clock_info('perf_counter').resolution
1e-07