Оптимизация преобразования datetime.date в unix метка времени в python - PullRequest
0 голосов
/ 13 января 2020

Я пытался сделать это как можно быстрее, избегая при этом проблем с часовым поясом.

Этот метод кажется самым медленным:

def to_unix_timestamp(stamp):
    return int(stamp.strftime('%s'))

Он дает следующие результаты:

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
4328301    1.620    0.000   10.009    0.000 utils.py:13(to_unix_timestamp)

Кажется, что это немного лучше, но все еще относительно медленно на мой вкус:

def to_unix_timestamp(stamp):
    return time.mktime(stamp.timetuple())

Результаты:

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
4328301    1.381    0.000    8.158    0.000 utils.py:13(to_unix_timestamp)

Есть ли способ, который Я мог бы добиться значительного ускорения без использования часовых поясов? Обратите внимание, что я ограничен python 2,7.

1 Ответ

0 голосов
/ 15 января 2020

Определите d0 = datetime.date(1970, 1, 1), а затем выполните (stamp - d0).total_seconds()? … - jasonharper

Я столкнулся с проблемами «часового пояса», которых боялся. После проверки по сравнению с другими методами, я обнаружил, что время этого метода будет смещено на один час вперед. Любая идея, что может быть причиной этого?

Да, другие методы неявно используют местное время, учитывая ваш часовой пояс. Объект datetime.date d0 (с разрешением в 1 день) не несет в себе эту информацию о часовом поясе, поэтому возникает расхождение при взятии разницы stamp - d0. Чтобы исправить это, мы можем построить d0, который представляет истинную эпоху:

d0 = datetime.datetime.fromtimestamp(0)

С этим (datetime.datetime.combine(stamp, datetime.time.min) - d0).total_seconds() дает ожидаемые значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...