mirror of https://github.com/python/cpython
bpo-47012: speed up iteration of bytes and bytearray (GH-31867)
This commit is contained in:
parent
894d0ea5af
commit
bd1cf6ecee
|
@ -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);
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Speed up iteration of :class:`bytes` and :class:`bytearray` by 30%. Patch by Kumar Aditya.
|
|
@ -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;
|
||||||
|
|
|
@ -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++]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue