我想比较使用Python和C++从stdin读取字符串的读取行,并且看到我的C++代码运行速度比等效的Python代码慢一个数量级,这让我很震惊.由于我的C++生锈了,我还不是专家Pythonista,请告诉我,如果我做错了什么或者我是否误解了什么.
(TLDR回答:包括声明:cin.sync_with_stdio(false)或者只是fgets改用.
TLDR结果:一直向下滚动到我的问题的底部并查看表格.)
C++代码:
#include <iostream>
#include <time.h>
using namespace std;
int main() {
string input_line;
long line_count = 0;
time_t start = time(NULL);
int sec;
int lps;
while (cin) {
getline(cin, input_line);
if (!cin.eof())
line_count++;
};
sec = (int) time(NULL) - start;
cerr << "Read " << line_count << " lines in " << sec << " seconds.";
if (sec > 0) {
lps = line_count / sec;
cerr << " LPS: " << lps …Run Code Online (Sandbox Code Playgroud) 我在Python中有一个命令行程序需要一段时间才能完成.我想知道完成跑步所需的确切时间.
我看过这个timeit模块,但它似乎只适用于小代码片段.我想要整个计划的时间.
我想记录真实壁挂时间有多长.目前我这样做:
startTime = time.time()
someSQLOrSomething()
print "That took %.3f seconds" % (time.time() - startTime)
Run Code Online (Sandbox Code Playgroud)
但是如果在SQL查询(或其他任何东西)运行时调整时间,则会失败(产生不正确的结果).
我不想只是对它进行基准测试.我想在实时应用程序中记录它,以便查看实时系统的趋势.
我想要像clock_gettime(CLOCK_MONOTONIC,...)这样的东西,但是在Python中.并且最好不必编写调用clock_gettime()的C模块.
有没有办法在Python中以高精度测量时间---比一秒更精确?我怀疑是否有跨平台的方式来做到这一点; 我对Unix上的高精度时间感兴趣,特别是在Sun SPARC机器上运行的Solaris.
timeit似乎能够进行高精度的时间测量,但我不想测量代码片段需要多长时间,而是想直接访问时间值.
如何在C中获得微秒时间戳?
我正在尝试:
struct timeval tv;
gettimeofday(&tv,NULL);
return tv.tv_usec;
Run Code Online (Sandbox Code Playgroud)
但是这会返回一些无意义的值,如果我得到两个时间戳,第二个可以比第一个更小或更大(第二个应该总是更大).是否可以将gettimeofday返回的魔术整数转换为可以实际使用的正常数字?
我希望在用C++实现的程序的微秒内获得准确的执行时间.我试图用clock_t获得执行时间,但这不准确.
我最近一直在构建一个错误记录应用程序,并且正在为一种准确的时间戳记输入数据.当我准确地说我的意思是每个时间戳应该相对于彼此准确(不需要同步到原子钟或类似的东西).
我一直在使用datetime.now()作为第一次尝试,但这并不完美:
>>> for i in range(0,1000):
... datetime.datetime.now()
...
datetime.datetime(2008, 10, 1, 13, 17, 27, 562000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 562000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 562000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 562000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 578000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 578000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 578000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 578000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 578000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 609000) …Run Code Online (Sandbox Code Playgroud) 在将Python日期时间转换为时间戳时,有没有办法保持微秒精度?
>>> import datetime
>>> d1 = datetime.datetime(2013,7,31,9,13,8,829)
>>> import time
>>> d1_ts = time.mktime(d1.timetuple())
>>> d1
datetime.datetime(2013, 7, 31, 9, 13, 8, 829)
>>> d1_ts
1375279988.0
>>> d1.fromtimestamp(d1_ts)
datetime.datetime(2013, 7, 31, 9, 13, 8)
Run Code Online (Sandbox Code Playgroud)
我.829在转换时输了.这是非常重要的,因为我有一个开始和结束时间戳,我需要以设定的间隔(使用亚秒级)逐步完成,以从一些传感器收集数据.
最终它将用于类似于此的函数:
from scipy import arange
sample_time = 0.02
for i in arange(d1_ts, d2_ts, sample_time):
# do stuff
Run Code Online (Sandbox Code Playgroud)
如果sample_time这么小,那么mircoseconds很重要.
我需要编写一个定期发送UDP数据包的Linux应用程序.理想情况下,频率应为每1 ms,数据包之间的间隔应保持一致.
我试过这样通过普通的套接字来做到这一点:
while(counter < 4294967295)
{
for (k=0; k<4; k++) //Convert counter value to string
{
buf[k]=((unsigned char*)(&counter))[k];
}
sn = sendto(sender, &buf, sizeof(buf), 0, (struct sockaddr *)&srv_addr, sizeof(srv_addr)); // Sending UDP segment
if (sn < 0 ) error("UDP send fail!"); //Error handle
counter++;
nanosleep(&delay, NULL); //Sleep
}
Run Code Online (Sandbox Code Playgroud)
在上面的应用程序中,我只用一个计数器值填充UDP数据包,所以我可以在接收器的末端区分它们.
基本上这个代码确实起到了作用,但是存在以下问题:1.频率不够高,受主机性能和其他应用的影响很大.2.数据包间隔不一致,因为有RTC用作参考.但是,如果我尝试进行RTC检查,那使得数据包速率更慢.
我认为应该以更优雅的方式用不同的方法实现我的目标.请提出建议.
我有一个python脚本调用基于USB的数据采集C#dotnet可执行文件.主要的python脚本做了许多其他的事情,例如它控制步进电机.我们想检查各种操作的相对时间,为此目的,dotnet exe生成一个带有来自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,但它太慢了,开销大约48ms.我需要一些<= 1ms的开销.time.clock()似乎足够快,就像c#Stopwatch.GetTimestamp()一样.
TIA,Radim
我正在尝试将压力传感器(MS5803-14BA)与我的电路板(NUCLEO-STM32L073RZ)连接。
根据数据表(第3页),压力传感器需要几毫秒的时间才能准备好读取测量值。对于我的项目,我对转换原始数据大约需要10 ms的最高分辨率感兴趣。
不幸的是,该压力传感器没有任何可用于查看测量准备就绪时间的中断引脚,因此,我暂时解决了在请求新数据后延迟的问题。
我不喜欢当前的解决方案,因为在这10毫秒内,我可以让单片机工作在其他地方(我的板上还连接了其他几个传感器),但是没有任何中断引脚,我不确定这是什么。解决此问题的最佳方法。
我想到了另一个解决方案:使用计时器,该计时器每20秒触发一次,并执行以下操作:
1.a Read the current value stored in the registers (discarding the first value)
1.b Ask for a new value
Run Code Online (Sandbox Code Playgroud)
这样,在下一次迭代中,我只需要读取上一次迭代结束时请求的值即可。
我不喜欢我的测量结果总是20毫秒。直到延迟保持20毫秒,它应该还是可以的,但是如果我需要降低速率,则解决方案的读数“老化”会增加。
您对如何处理还有其他想法吗?
谢谢。
注意:如果您需要查看我当前的实现,请告诉我。