Точное добавление метки времени во входе Python

private fun testFunction() {
    val pics: Array<ImageView?> = arrayOfNulls(6)

    // TODO the rest of your test
}
12
задан smci 10 July 2017 в 15:14
поделиться

6 ответов

Вы вряд ли получите достаточно мелкомодульный контроль, что можно полностью устранить возможность дублирующихся меток времени - Вам было бы нужно разрешение, меньшее, чем время, которое требуется для генерации объекта даты и времени. Существует несколько других подходов, которые Вы могли бы проявить для контакта с ним:

  1. Соглашение с ним. Оставьте свои метки времени групповыми, как они, но полагаются на вид Python, являющийся стабильным для контакта с переупорядочением проблем. При сортировке на метке времени сначала, затем что-то еще сохранит упорядочивание метки времени - просто необходимо стараться всегда запустить с метки времени, заказанной список каждый раз, вместо того, чтобы делать несколько видов в том же списке.

  2. Добавьте свое собственное значение для осуществления уникальности. Например, включайте целочисленное значение постепенного увеличения как часть ключа или добавьте такое значение, только если метки времени отличаются. Например.

Следующее гарантирует уникальные значения метки времени:

    class TimeStamper(object):
        def __init__(self):
            self.lock = threading.Lock()
            self.prev = None
            self.count = 0

         def getTimestamp(self):
             with self.lock:
                 ts = str(datetime.now())
                 if ts == self.prev:
                     ts +='.%04d' % self.count
                     self.count += 1
                 else:
                     self.prev = ts
                     self.count = 1
             return ts

Для нескольких процессов (а не потоки), это становится немного более хитрым все же.

7
ответ дан 2 December 2019 в 04:54
поделиться

time.clock () только измеряет wallclock время в Windows. В других системах, time.clock () на самом деле измеряет процессорное время. В тех системах time.time () более подходит в течение wallclock времени, и это имеет столь высокое разрешение, как Python может справиться - который так высок, как ОС может справиться; обычно с помощью gettimeofday (3) (разрешение микросекунды) или ftime (3) (разрешение миллисекунды.) Другие ограничения ОС на самом деле принимают реальное решение намного выше, чем это. datetime.datetime.now () использует time.time (), таким образом, time.time () непосредственно не будет лучше.

Для записи, если я использую datetime.datetime.now () в цикле, я занимаюсь 1/10000, поддерживают предложение. От рассмотрения Ваших данных у Вас есть много, намного более грубое разрешение, чем это. Я не уверен, существует ли что-нибудь, что Python как таковой может сделать, хотя Вы можете убеждать ОС добиваться большего успеха через другие средства.

Я, кажется, вспоминаю, что в Windows, time.clock () на самом деле (немного) более точно, чем time.time (), но он измеряет wallclock начиная с первого вызова к time.clock (), таким образом, необходимо не забыть 'инициализировать' его сначала.

12
ответ дан 2 December 2019 в 04:54
поделиться

"метка времени должна быть точной друг относительно друга"

Почему время? Почему не порядковый номер? Если это - какой-либо клиент клиент-серверного приложения, сетевая задержка делает метки времени довольно случайными.

Вы соответствуете некоторому внешнему источнику информации? Сказать вход в систему другое приложение? Снова, если будет сеть, то те времена не будут слишком близки.

Если необходимо соответствовать вещам между отдельными приложениями, рассмотреть раздающий GUID так, чтобы оба приложения зарегистрировали значение GUID. Затем Вы могли быть абсолютно уверены, что они соответствуют, независимо от синхронизации различий.

Если Вы хотите относительный порядок быть точно правыми, возможно, это достаточно для Вашего регистратора для присвоения порядкового номера каждому сообщению в порядке, они были получены.

3
ответ дан 2 December 2019 в 04:54
поделиться

Спасибо всем за Ваши вклады - у них есть все быть очень полезными. Ответ Brian кажется самым близким к тому, с чем я в конечном счете пошел (т.е. соглашение с ним, но используйте своего рода уникальный идентификатор - видят ниже), таким образом, я принял его ответ. Мне удалось консолидировать все различные получатели данных в единственный поток, который является, где добавление метки времени теперь сделано с помощью моего нового класса AccurrateTimeStamp. Что я сделал работы, пока метка времени является первой вещью использовать часы.

Как S.Lott предусматривает без ОС в реальном времени, они никогда не собираются быть абсолютно прекрасными. Я действительно только хотел что-то, что позволит мне видеть относительно каждого входящего блока данных, когда вещи получались поэтому, что я имею ниже, будет работать хорошо.

Еще раз спасибо все!

import time

class AccurateTimeStamp():
    """
    A simple class to provide a very accurate means of time stamping some data
    """

    # Do the class-wide initial time stamp to synchronise calls to 
    # time.clock() to a single time stamp
    initialTimeStamp = time.time()+ time.clock()

    def __init__(self):
        """
        Constructor for the AccurateTimeStamp class.
        This makes a stamp based on the current time which should be more 
        accurate than anything you can get out of time.time().
        NOTE: This time stamp will only work if nothing has called clock() in
        this instance of the Python interpreter.
        """
        # Get the time since the first of call to time.clock()
        offset = time.clock()

        # Get the current (accurate) time
        currentTime = AccurateTimeStamp.initialTimeStamp+offset

        # Split the time into whole seconds and the portion after the fraction 
        self.accurateSeconds = int(currentTime)
        self.accuratePastSecond = currentTime - self.accurateSeconds


def GetAccurateTimeStampString(timestamp):
    """
    Function to produce a timestamp of the form "13:48:01.87123" representing 
    the time stamp 'timestamp'
    """
    # Get a struct_time representing the number of whole seconds since the 
    # epoch that we can use to format the time stamp
    wholeSecondsInTimeStamp = time.localtime(timestamp.accurateSeconds)

    # Convert the whole seconds and whatever fraction of a second comes after
    # into a couple of strings 
    wholeSecondsString = time.strftime("%H:%M:%S", wholeSecondsInTimeStamp)
    fractionAfterSecondString = str(int(timestamp.accuratePastSecond*1000000))

    # Return our shiny new accurate time stamp   
    return wholeSecondsString+"."+fractionAfterSecondString


if __name__ == '__main__':
    for i in range(0,500):
        timestamp = AccurateTimeStamp()
        print GetAccurateTimeStampString(timestamp)
5
ответ дан 2 December 2019 в 04:54
поделиться

Я хотел благодарить J. Клетка для этого последнего сообщения.

Для моей работы "разумная" синхронизация событий через процессы и платформы важна. Существует, очевидно, много мест, куда дела могут идти искоса (дрейф часов, контекстное переключение, и т.д.), однако это точное решение для синхронизации, я думаю, поможет гарантировать, что зарегистрированные метки времени достаточно с точностью до, посмотрите другие источники ошибки.

Тем не менее существует несколько деталей, интересно, о котором объяснены в Когда Вопрос MicroSeconds. Например, я думаю, что time.clock () в конечном счете перенесется. Я думаю, чтобы это работало на длительный процесс, Вам, возможно, придется обработать это.

0
ответ дан 2 December 2019 в 04:54
поделиться

Вот поток о Python, синхронизирующем точность:

Python - time.clock () по сравнению с time.time () - точность?

2
ответ дан 2 December 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: