Cómo contar elementos óptimamente en una lista de Python

Esta es casi la misma pregunta queaquí, excepto que estoy preguntando sobre la solución más eficiente para un resultado ordenado.

Tengo una lista (aproximadamente 10 enteros al azar entre 0 y 12), por ejemplo:

the_list = [5, 7, 6, 5, 5, 4, 4, 7, 5, 4]

Quiero crear una función que devuelva una lista de tuplas (elemento, recuento) ordenadas por el primer elemento, por ejemplo

output = [(4, 3), (5, 4), (6, 1), (7, 2)]

Hasta ahora he usado:

def dupli(the_list):
    return [(item, the_list.count(item)) for item in sorted(set(the_list))]

Pero llamo a esta función casi un millón de veces y necesito hacerlo tan rápido como pueda (python). Por lo tanto mi pregunta:¿Cómo hacer que esta función consuma menos tiempo? (¿Qué pasa con la memoria?)

He jugado un poco, pero no apareció nada obvio:

from timeit import Timer as T
number=10000
setup = "the_list=[5, 7, 6, 5, 5, 4, 4, 7, 5, 4]"

stmt = "[(item, the_list.count(item)) for item in sorted(set(the_list))]"
T(stmt=stmt, setup=setup).timeit(number=number)

Out[230]: 0.058799982070922852

stmt = "L = []; \nfor item in sorted(set(the_list)): \n    L.append((item, the_list.count(item)))"
T(stmt=stmt, setup=setup).timeit(number=number)

Out[233]: 0.065041065216064453

stmt = "[(item, the_list.count(item)) for item in set(sorted(the_list))]"
T(stmt=stmt, setup=setup).timeit(number=number)

Out[236]: 0.098351955413818359

Gracias
Christophe

Respuestas a la pregunta(6)

Su respuesta a la pregunta