mirror of
https://github.com/python/cpython.git
synced 2025-08-25 03:04:55 +00:00
Issue #14744: Use the new _PyUnicodeWriter internal API to speed up str%args and str.format(args)
* Formatting string, int, float and complex use the _PyUnicodeWriter API. It avoids a temporary buffer in most cases. * Add _PyUnicodeWriter_WriteStr() to restore the PyAccu optimization: just keep a reference to the string if the output is only composed of one string * Disable overallocation when formatting the last argument of str%args and str.format(args) * Overallocation allocates at least 100 characters: add min_length attribute to the _PyUnicodeWriter structure * Add new private functions: _PyUnicode_FastCopyCharacters(), _PyUnicode_FastFill() and _PyUnicode_FromASCII() The speed up is around 20% in average.
This commit is contained in:
parent
a1b0c9fc4d
commit
d3f0882dfb
12 changed files with 878 additions and 437 deletions
|
@ -267,13 +267,15 @@ static PyObject *
|
|||
float_repr(PyFloatObject *v)
|
||||
{
|
||||
PyObject *result;
|
||||
char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
|
||||
'r', 0,
|
||||
Py_DTSF_ADD_DOT_0,
|
||||
NULL);
|
||||
char *buf;
|
||||
|
||||
buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
|
||||
'r', 0,
|
||||
Py_DTSF_ADD_DOT_0,
|
||||
NULL);
|
||||
if (!buf)
|
||||
return PyErr_NoMemory();
|
||||
result = PyUnicode_FromString(buf);
|
||||
result = _PyUnicode_FromASCII(buf, strlen(buf));
|
||||
PyMem_Free(buf);
|
||||
return result;
|
||||
}
|
||||
|
@ -1703,11 +1705,22 @@ static PyObject *
|
|||
float__format__(PyObject *self, PyObject *args)
|
||||
{
|
||||
PyObject *format_spec;
|
||||
_PyUnicodeWriter writer;
|
||||
int ret;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "U:__format__", &format_spec))
|
||||
return NULL;
|
||||
return _PyFloat_FormatAdvanced(self, format_spec, 0,
|
||||
PyUnicode_GET_LENGTH(format_spec));
|
||||
|
||||
_PyUnicodeWriter_Init(&writer, 0);
|
||||
ret = _PyFloat_FormatAdvancedWriter(
|
||||
&writer,
|
||||
self,
|
||||
format_spec, 0, PyUnicode_GET_LENGTH(format_spec));
|
||||
if (ret == -1) {
|
||||
_PyUnicodeWriter_Dealloc(&writer);
|
||||
return NULL;
|
||||
}
|
||||
return _PyUnicodeWriter_Finish(&writer);
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(float__format__doc,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue