mirror of
https://github.com/python/cpython.git
synced 2025-11-24 12:20:42 +00:00
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:
parent
d61dda52ba
commit
fc3e22a06c
2 changed files with 26 additions and 11 deletions
|
|
@ -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.
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue