bpo-47012: speed up iteration of bytes and bytearray (GH-31867)

This commit is contained in:
Kumar Aditya 2022-03-23 14:00:05 +05:30 committed by GitHub
parent 894d0ea5af
commit bd1cf6ecee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 13 additions and 9 deletions

View File

@ -23,8 +23,9 @@ extern void _PyLong_FiniTypes(PyInterpreterState *interp);
#define _PyLong_SMALL_INTS _Py_SINGLETON(small_ints) #define _PyLong_SMALL_INTS _Py_SINGLETON(small_ints)
// _PyLong_GetZero() and _PyLong_GetOne() must always be available // _PyLong_GetZero() and _PyLong_GetOne() must always be available
#if _PY_NSMALLPOSINTS < 2 // _PyLong_FromUnsignedChar must always be available
# error "_PY_NSMALLPOSINTS must be greater than 1" #if _PY_NSMALLPOSINTS < 257
# error "_PY_NSMALLPOSINTS must be greater than or equal to 257"
#endif #endif
// Return a borrowed reference to the zero singleton. // Return a borrowed reference to the zero singleton.
@ -37,6 +38,11 @@ static inline PyObject* _PyLong_GetZero(void)
static inline PyObject* _PyLong_GetOne(void) static inline PyObject* _PyLong_GetOne(void)
{ return (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS+1]; } { return (PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS+1]; }
static inline PyObject* _PyLong_FromUnsignedChar(unsigned char i)
{
return Py_NewRef((PyObject *)&_PyLong_SMALL_INTS[_PY_NSMALLNEGINTS+i]);
}
PyObject *_PyLong_Add(PyLongObject *left, PyLongObject *right); PyObject *_PyLong_Add(PyLongObject *left, PyLongObject *right);
PyObject *_PyLong_Multiply(PyLongObject *left, PyLongObject *right); PyObject *_PyLong_Multiply(PyLongObject *left, PyLongObject *right);
PyObject *_PyLong_Subtract(PyLongObject *left, PyLongObject *right); PyObject *_PyLong_Subtract(PyLongObject *left, PyLongObject *right);

View File

@ -0,0 +1 @@
Speed up iteration of :class:`bytes` and :class:`bytearray` by 30%. Patch by Kumar Aditya.

View File

@ -6,6 +6,7 @@
#include "pycore_bytes_methods.h" #include "pycore_bytes_methods.h"
#include "pycore_object.h" // _PyObject_GC_UNTRACK() #include "pycore_object.h" // _PyObject_GC_UNTRACK()
#include "pycore_strhex.h" // _Py_strhex_with_sep() #include "pycore_strhex.h" // _Py_strhex_with_sep()
#include "pycore_long.h" // _PyLong_FromUnsignedChar()
#include "bytesobject.h" #include "bytesobject.h"
/*[clinic input] /*[clinic input]
@ -2428,7 +2429,6 @@ static PyObject *
bytearrayiter_next(bytesiterobject *it) bytearrayiter_next(bytesiterobject *it)
{ {
PyByteArrayObject *seq; PyByteArrayObject *seq;
PyObject *item;
assert(it != NULL); assert(it != NULL);
seq = it->it_seq; seq = it->it_seq;
@ -2437,11 +2437,8 @@ bytearrayiter_next(bytesiterobject *it)
assert(PyByteArray_Check(seq)); assert(PyByteArray_Check(seq));
if (it->it_index < PyByteArray_GET_SIZE(seq)) { if (it->it_index < PyByteArray_GET_SIZE(seq)) {
item = PyLong_FromLong( return _PyLong_FromUnsignedChar(
(unsigned char)PyByteArray_AS_STRING(seq)[it->it_index]); (unsigned char)PyByteArray_AS_STRING(seq)[it->it_index++]);
if (item != NULL)
++it->it_index;
return item;
} }
it->it_seq = NULL; it->it_seq = NULL;

View File

@ -3133,7 +3133,7 @@ striter_next(striterobject *it)
assert(PyBytes_Check(seq)); assert(PyBytes_Check(seq));
if (it->it_index < PyBytes_GET_SIZE(seq)) { if (it->it_index < PyBytes_GET_SIZE(seq)) {
return PyLong_FromLong( return _PyLong_FromUnsignedChar(
(unsigned char)seq->ob_sval[it->it_index++]); (unsigned char)seq->ob_sval[it->it_index++]);
} }