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)
/*[clinic end generated code: output=d5474697df6b251c input=21688afa289c0a06]*/
{
PyObject *time;
PyObject *result;
time = time_time();
if (time == NULL)
return NULL;
/* Use C implementation to boost performance for date type */
if (type == &PyDateTime_DateType) {
struct tm tm;
time_t t;
time(&t);
/* Note well: today() is a class method, so this may not call
* date.fromtimestamp. For example, it may call
* 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().
if (_PyTime_localtime(t, &tm) != 0) {
return NULL;
}
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);
return result;
}