mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +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)
|
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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue