como contar de maneira ideal elementos em uma lista python

Esta é quase a mesma pergunta queaqui, exceto que estou perguntando sobre a solução mais eficiente para um resultado classificado.

Eu tenho uma lista (cerca de 10 números inteiros aleatoriamente entre 0 e 12), por exemplo:

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

Quero criar uma função que retorne uma lista de tuplas (itens, contagens) ordenadas pelo primeiro elemento, por exemplo

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

Até agora eu tenho usado:

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

Mas eu chamo essa função de quase um milhão de vezes e preciso torná-la o mais rápido possível (python). Portanto, minha pergunta:Como tornar essa função menos tempo consumindo? (e a memória?)

Eu brinquei um pouco, mas nada óbvio surgiu:

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

obrigado
Christophe

questionAnswers(6)

yourAnswerToTheQuestion