如何以正确的方式计算“每秒时间”?

时间:2018-01-24 00:52:07

标签: python python-3.x loops

目标:我想看看python能够每1秒打印一次的次数。

出于教育目的,我正在尝试制作一个脚本,显示每秒钟随机模块在循环中出现的次数。如何以最快的pythonic方式做到这一点?

首先,我计算这段代码的秒数:

import time

sec = 0

while True:
    print(sec)
    time.sleep(1)
    sec += 1

但这个似乎比真正的秒钟慢。

所以我决定使用本地秒。另外,在继续我的脚本之前,我想计算python多少次手动打印“你这个傻瓜”,所以我写了下面的代码:

import time   

def LocalSeconds():
    local_seconds = time.gmtime()[5:-3]
    local_seconds = int(local_seconds[0])
    return local_seconds


while True:
    print(LocalSeconds(), 'you fool')

输出: 第一秒 - 每秒14次; 下一秒--13次; 下一秒 - 12次,等等。为什么它变慢?

我现在在哪里结束/停留:

import time, random


def RandomNumbers():
    return random.randint(3,100)


def LocalSeconds():
    local_seconds = time.gmtime()[5:-3]
    local_seconds = int(local_seconds[0])
    return local_seconds


def LocalSecondsWithPing():
    local_seconds_ping = time.gmtime()[5:-3]
    local_seconds_ping = int(local_seconds[0:1])
    return local_seconds_ping



record_seconds = []
record_seconds_with_ping = []



while True:
    record_seconds.append(LocalSeconds())
    record_seconds_with_ping.append(LocalSecondsWithPing())

    if record_seconds == record_seconds_with_ping:
        RandomNumbers()
        del record_seconds_with_ping[0]

    del record_seconds[-1]

另外,我想我需要使用“for”循环,而不是“while”?怎么做这个脚本?

1 个答案:

答案 0 :(得分:0)

计算一秒钟不会给你一个好结果。一秒钟内的打印数量可能会有所不同,具体取决于系统上当前运行的其他线程(适用于操作系统或其他程序),并且可能会受到其他未知因素的影响。

考虑以下代码:

import calendar
import time


NumOfSeconds=100                              #Number of seconds we average over
msg='Display this message'                    #Message to be displayed
count=0                                       #Number of time message will end up being displayed
#Time since the epoch in seconds + time of seconds in which we count
EndTime=calendar.timegm(time.gmtime()) + NumOfSeconds  

while calendar.timegm(time.gmtime())<EndTime: #While we are not at the end point yet
    print(msg)                                #Print message
    count=count+1                             #Count message printed

print(float(count)/NumOfSeconds)              #Average number of prints per second

这里calendar.timegm(time.gmtime())给出了自纪元以来秒数的时间(如果您不知道那是什么,请阅读this。但基本上它只是一个固定的时间点现在大多数计算机系统都用作参考点。 所以我们将EndTime设置为该点+我们想要平均的秒数。然后,在循环中,我们打印我们要测试的消息并计算我们这样做的次数,在每次迭代检查我们没有超过结束时间之间。 最后,我们打印我们打印消息的平均每秒次数。这有助于我们可能最终在自纪元以来的一整秒结束时开始计数,在这种情况下,我们实际上不会有一秒钟来打印消息,而只是其中的一小部分。如果我们确保NumOfSeconds足够大,那么该错误添加将很小(例如,对于NumOfSeconds = 100,该错误为~1%)。

我们应该注意,实际数字还取决于我们不断测试当前时间和计算打印数量这一事实,但是,虽然我没有在这里测试过,但通常情况是打印到屏幕比这些操作花费的时间要长得多。