gh-88473: Implement fast path in date.today() for date types (#130980)

Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
This commit is contained in:
Stan Ulbrych 2025-09-16 10:28:54 +01:00 committed by GitHub
parent d61dda52ba
commit fc3e22a06c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 26 additions and 11 deletions

View file

@ -0,0 +1,3 @@
Implement a fast path for :class:`datetime.date` objects in :func:`datetime.date.today`
which results in a 5x performance gain while proper subclasses retain their
previous performance.

View file

@ -3291,19 +3291,31 @@ static PyObject *
datetime_date_today_impl(PyTypeObject *type) datetime_date_today_impl(PyTypeObject *type)
/*[clinic end generated code: output=d5474697df6b251c input=21688afa289c0a06]*/ /*[clinic end generated code: output=d5474697df6b251c input=21688afa289c0a06]*/
{ {
PyObject *time; /* Use C implementation to boost performance for date type */
PyObject *result; if (type == &PyDateTime_DateType) {
time = time_time(); struct tm tm;
if (time == NULL) time_t t;
return NULL; time(&t);
/* Note well: today() is a class method, so this may not call if (_PyTime_localtime(t, &tm) != 0) {
* date.fromtimestamp. For example, it may call return NULL;
* datetime.fromtimestamp. That's why we need all the accuracy }
* time.time() delivers; if someone were gonzo about optimization,
* date.today() could get away with plain C time(). return new_date_ex(tm.tm_year + 1900,
tm.tm_mon + 1,
tm.tm_mday,
type);
}
PyObject *time = time_time();
if (time == NULL) {
return NULL;
}
/* Note well: since today() is a class method, it may not call
* date.fromtimestamp, e.g., it may call datetime.fromtimestamp.
*/ */
result = PyObject_CallMethodOneArg((PyObject*)type, &_Py_ID(fromtimestamp), time); PyObject *result = PyObject_CallMethodOneArg((PyObject*)type, &_Py_ID(fromtimestamp), time);
Py_DECREF(time); Py_DECREF(time);
return result; return result;
} }