【问题标题】:How to count "times per second" in a correct way?如何以正确的方式计算“每秒次数”?
【发布时间】:2018-07-02 22:51:21
【问题描述】:

目标:我想看看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”?这个脚本怎么做?

【问题讨论】:

  • 您应该使用timeit 模块。
  • 这里一定很奇怪...在我的低功率 VPS 上,您使用 gmtime 的示例每秒打印超过 100000 次。您认为是什么让您的脚本如此缓慢?

标签: python python-3.x loops


【解决方案1】:

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

考虑以下代码:

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%)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    相关资源
    最近更新 更多