Я работаю над очень простой программой броска игральных костей на Python и в настоящее время добавляю систему ETA (запрос программы бросить кости 1000000+ раз занимает некоторое время, а некоторые могут увидеть это как сбой) и систему, о которой я думал вверх это следующее:

Поскольку «игральные кости» «бросаются» путем генерации случайного числа и повторения в цикле for, если я возьму переменную и через секунду сравню ее с переменной, я мог бы сделать некоторые основные математические расчеты, чтобы угадать оставшееся время.

Моя проблема в том, как я мог подождать секунду между счетами, не останавливая программу полностью (time.sleep).

Любая помощь будет оценена, спасибо!

КОД:

    import random
finished = 0
printresults = 0
dicesides = 0
rolls = 0
amountcompleted = 0
while finished !="n":
    finished = 0
    printresults = 0
    dicesides = 0
    rolls = 0
    amountcompleted = 0
    rollsdone = 0
    countlist = []

    rolls = int(input("How many times should the dice be rolled? ")) #Variable that counts how many times the dice should be rolled

    dicesides = int(input("How many sides does the dice have? ")) #Variable that contains how many sides the dice has

    while printresults !="y" and printresults !="n":
        printresults = input("Print dice roll results as they're created? say y/n ") #If user says y, result will be printed as results are made
        if printresults !="y" and printresults !="n":
            print("Answer invalid")  

    while amountcompleted !="y" and amountcompleted !="n":
        amountcompleted = input("Print the amount of rolls completed as the dice is rolled? (Reccomended when rolling over 1M times) answer y/n ")
        if amountcompleted !="y" and amountcompleted !="n":
            print("Answer invalid")

    for counter in range(0,dicesides): #Creates list of the right length to hold results
        countlist.append(0)

    for counter in range (0,rolls): #Main bit of the script that actually calculates and stores amount of dice rolls
        number = random.randint(1,dicesides) #"Rolls" the dice, using the dicesides variable.
        if printresults == "y":
            print(number) #Prints the results as they are made if enabled
        if amountcompleted == "y":
            (rollsdone) = int(rollsdone + 1)
            print("Completed {0} rolls".format((rollsdone)))
        for counter in range (0,dicesides + 1): #For variable to store the results in a list
            if number == counter:
                countlist[counter-1] = countlist[counter-1] + 1 #Adds 1 to the right bit of the list

    for counter in range(0,dicesides):
        print("Number of {0}s: {1}".format(counter + 1,countlist[counter])) #Prints results
    while finished != "y" and finished != "n":
        finished = input("Reroll? Answer y/n ") #Asks the user if they want to reroll with different settings
        if finished != "y" and finished != "n":
            print("Input invalid")
0
UnicornsOnLSD 29 Авг 2017 в 15:40

3 ответа

Лучший ответ
import time, random

def roll(n):
    timeStarted = time.time()
    recorded = False
    for x in range(1, n + 1, 1):
        random.randint(1, 6)

        now = time.time()

        if (int(now) - int(timeStarted) == 1) and not (recorded):
            recorded = True
            rollsSecond = n - x
            print(rollsSecond, "rolls per second")

roll(10000000)

Проверяет время запуска и сравнивает секунду спустя

0
Joshua Nixon 29 Авг 2017 в 12:44

Просто чтобы внести свой вклад. Вы можете легко создать декоратор и использовать его во всем приложении. Вот пример:

class TimeMuncher(object):
  def __init__(self, f):
    self.start = None
    self.stop = None
    self.function = f

  def __call__(self, *args):
    self.start = time.time() * 1000.0
    self.function(*args)
    self.stop = time.time() * 1000.0
    self.tell_time()

  def tell_time(self):
    #or log..
    print("{} : {} ms".format(self.function.__name__, self.stop -
    self.start))

@TimeMuncher
def aFunction(name, no):
  print("my function " + name + str(no) )

aFunction("hello", 2)

Таким образом, каждый раз, когда вызывается функция или метод, вы можете управлять временем, необходимым для выполнения своей работы. Это легко настраивается благодаря Python OO.

РЕДАКТИРОВАТЬ: Я думаю, что вы должны реорганизовать свой код, чтобы вы могли оценить время на конкретной логике вашей программы вместо текущей огромной функции, которую вы используете.

РЕДАКТИРОВАТЬ 2: Вы можете установить статическую переменную CURRENT_TIME / WAIT_TIME в TimeMuncher и регистрировать / распечатывать свое время только с заданным интервалом, редактируя __init__() и __call__().

0
Pobe 29 Авг 2017 в 13:11

Если вы используете разницу времени, используйте что-то вроде этого,

>>>import time
>>> s = time.time()
>>> for i in range(10):
...   print i
... 
0
1
2
3
4
5
6
7
8
9
>>>end = time.time()-s
>>> print end
15.814720153808594
>>> 

Здесь s время начала. получит разницу после завершения процесса ... это end

0
Mohideen bin Mohammed 29 Авг 2017 в 12:45