Skip to content

Commit

Permalink
Used datetime.timezone.utc instead of pytz.utc for better performance.
Browse files Browse the repository at this point in the history
  • Loading branch information
sir-sigurd authored and timgraham committed Mar 20, 2018
1 parent 281c022 commit 27ca5ce
Show file tree
Hide file tree
Showing 5 changed files with 10 additions and 20 deletions.
5 changes: 1 addition & 4 deletions django/contrib/sessions/backends/file.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,7 @@ def _last_modification(self):
Return the modification time of the file storing the session's content.
"""
modification = os.stat(self._key_to_file()).st_mtime
if settings.USE_TZ:
modification = datetime.datetime.utcfromtimestamp(modification)
return modification.replace(tzinfo=timezone.utc)
return datetime.datetime.fromtimestamp(modification)
return datetime.datetime.fromtimestamp(modification, timezone.utc if settings.USE_TZ else None)

def _expiry_date(self, session_data):
"""
Expand Down
6 changes: 1 addition & 5 deletions django/core/files/storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -336,11 +336,7 @@ def _datetime_from_timestamp(self, ts):
If timezone support is enabled, make an aware datetime object in UTC;
otherwise make a naive one in the local timezone.
"""
if settings.USE_TZ:
# Safe to use .replace() because UTC doesn't have DST
return datetime.utcfromtimestamp(ts).replace(tzinfo=timezone.utc)
else:
return datetime.fromtimestamp(ts)
return datetime.fromtimestamp(ts, timezone.utc if settings.USE_TZ else None)

def get_accessed_time(self, name):
return self._datetime_from_timestamp(os.path.getatime(self.path(name)))
Expand Down
2 changes: 1 addition & 1 deletion django/db/migrations/serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class DatetimeSerializer(BaseSerializer):
def serialize(self):
if self.value.tzinfo is not None and self.value.tzinfo != utc:
self.value = self.value.astimezone(utc)
value_repr = repr(self.value).replace("<UTC>", "utc")
value_repr = repr(self.value).replace("datetime.timezone(datetime.timedelta(0), 'UTC')", 'utc')
if isinstance(self.value, datetime_safe.datetime):
value_repr = "datetime.%s" % value_repr
imports = ["import datetime"]
Expand Down
3 changes: 1 addition & 2 deletions django/utils/feedgenerator.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,8 +173,7 @@ def latest_post_date(self):
if latest_date is None or item_date > latest_date:
latest_date = item_date

# datetime.now(tz=utc) is slower, as documented in django.utils.timezone.now
return latest_date or datetime.datetime.utcnow().replace(tzinfo=utc)
return latest_date or datetime.datetime.now(utc)


class Enclosure:
Expand Down
14 changes: 6 additions & 8 deletions django/utils/timezone.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@
Timezone-related classes and functions.
"""

import datetime
import functools
from contextlib import ContextDecorator
from datetime import datetime, timedelta, tzinfo
from datetime import timedelta, tzinfo
from threading import local

import pytz
Expand Down Expand Up @@ -52,7 +53,8 @@ def dst(self, dt):


# UTC time zone as a tzinfo instance.
utc = pytz.utc
# (Use utc = datetime.timezone.utc here when PY35 isn't supported.)
utc = datetime.timezone(ZERO, 'UTC')


def get_fixed_timezone(offset):
Expand Down Expand Up @@ -172,7 +174,7 @@ def template_localtime(value, use_tz=None):
This function is designed for use by the template engine.
"""
should_convert = (
isinstance(value, datetime) and
isinstance(value, datetime.datetime) and
(settings.USE_TZ if use_tz is None else use_tz) and
not is_naive(value) and
getattr(value, 'convert_to_local_time', True)
Expand Down Expand Up @@ -219,11 +221,7 @@ def now():
"""
Return an aware or naive datetime.datetime, depending on settings.USE_TZ.
"""
if settings.USE_TZ:
# timeit shows that datetime.now(tz=utc) is 24% slower
return datetime.utcnow().replace(tzinfo=utc)
else:
return datetime.now()
return datetime.datetime.now(utc if settings.USE_TZ else None)


# By design, these four functions don't perform any checks on their arguments.
Expand Down

0 comments on commit 27ca5ce

Please sign in to comment.