Dig into the CPython source code and visit Objects/listobject.c
, you will find the source code for the count()
method in there. It looks like this:
static PyObject *
list_count(PyListObject *self, PyObject *value)
{
Py_ssize_t count = 0;
Py_ssize_t i;
for (i = 0; i < Py_SIZE(self); i++) {
int cmp = PyObject_RichCompareBool(self->ob_item[i], value, Py_EQ);
if (cmp > 0)
count++;
else if (cmp < 0)
return NULL;
}
return PyLong_FromSsize_t(count);
}
What it does is to simply iterate over every PyObject
in the list, and if they are equal in rich comparision (see PEP 207), a counter is incremented. The function simply returns this counter.
In the end, the time complexity of list_count
is O(n). Just make sure that your objects don't have __eq__
functions with large time complexities and you'll be safe.