在win32上用python获取绝对时间/CPU周期计数的方法

4 投票
2 回答
1887 浏览
提问于 2025-04-16 08:28

我有一个Python脚本,它会调用一个基于USB的数据采集的C#程序。这个主要的Python脚本还做很多其他事情,比如控制步进电机。我们想要检查各种操作之间的相对时间,为此,C#程序会生成一个带有时间戳的日志,这个时间戳是通过C#的Stopwatch.GetTimestamp()获得的。根据我所知,这个方法得到的数字和调用win32 API的QueryPerformanceCounter()是一样的。

现在我想在Python脚本中获得类似的数字。time.clock()可以返回这样的值,但不幸的是,它会减去第一次调用time.clock()时得到的值。我该如何解决这个问题?从现有的Python模块中调用QueryPerformanceCounter()简单吗?还是我需要自己用C语言写一个Python扩展?

我忘了提,Tim Golden的Python WMI模块可以做到这一点: wmi.WMI().Win32_PerfRawData_PerfOS_System()[0].Timestamp_PerfTime ,但它太慢了,大约有48毫秒的延迟。我需要的是延迟小于等于1毫秒的东西。time.clock()似乎足够快,就像C#的Stopwatch.GetTimestamp()一样。

谢谢,

Radim

2 个回答

0

你可以直接在Python中调用C#的StopWatch类,对吧?可能需要一个小的包装器(我对Python和C#之间的互操作细节不太了解,抱歉)——如果你已经在用C#来获取数据,那么用Stopwatch来计时应该比其他任何方法都简单。

8

你试过用ctypes这个库吗?

from ctypes import *
val = c_int64()
windll.Kernel32.QueryPerformanceCounter(byref(val))
print val.value

撰写回答