gh-125420: implement Sequence.count API on memoryview objects#125443
gh-125420: implement Sequence.count API on memoryview objects#125443JelleZijlstra merged 15 commits intopython:mainfrom
Sequence.count API on memoryview objects#125443Conversation
count to memoryview objectsSequence.count API on memoryview objects
| Py_DECREF(iter); | ||
| return NULL; | ||
| } | ||
| int contained = PyObject_RichCompareBool(item, value, Py_EQ); |
There was a problem hiding this comment.
list.count has a special case for if (item == value) count++. I suspect that helps significantly here too, because the value item will usually be an interned integer.
There was a problem hiding this comment.
Actually, PyObject_RichCompareBool has that fast path inside as well. I had the fast path before but then I wondered whether it was really needed or not (and I was a bit too lazy for benchmarkings). But I forgot about the interned integer case so it's probably faster.
|
|
||
| Py_ssize_t count = 0; | ||
| PyObject *item = NULL; | ||
| while (PyIter_NextItem(iter, &item)) { |
There was a problem hiding this comment.
We could probably make this significantly more efficient by looking at the memory directly without materializing an iterator and all the elements. str.count is a similar example. However, that is going to be a lot more complicated, so it seems fine to skip it; if somebody wants to optimize this method later they can.
There was a problem hiding this comment.
Yes, that's what I suspected so I went for the simplest approach (at least to have the code around).
📚 Documentation preview 📚: https://cpython-previews--125443.org.readthedocs.build/