Calcular eficientemente la frecuencia de palabras en una cadena

Estoy analizando una larga cadena de texto y calculando la cantidad de veces que cada palabra aparece en Python. Tengo una función que funciona, pero estoy buscando consejos sobre si hay formas de hacerlo más eficiente (en términos de velocidad) y si incluso hay funciones de biblioteca de Python que podrían hacer esto por mí, así que no estoy reinventando la rueda

Puede sugerir una forma más eficiente de calcular las palabras más comunes que aparecen en una cadena larga (generalmente más de 1000 palabras en la cadena)?

¿Cuál es la mejor manera de ordenar el diccionario en una lista donde el primer elemento es la palabra más común, el segundo elemento es la segunda palabra más común, etc.?

test = """abc def-ghi jkl abc
abc"""

def calculate_word_frequency(s):
    # Post: return a list of words ordered from the most
    # frequent to the least frequent

    words = s.split()
    freq  = {}
    for word in words:
        if freq.has_key(word):
            freq[word] += 1
        else:
            freq[word] = 1
    return sort(freq)

def sort(d):
    # Post: sort dictionary d into list of words ordered
    # from highest freq to lowest freq
    # eg: For {"the": 3, "a": 9, "abc": 2} should be
    # sorted into the following list ["a","the","abc"]

    #I have never used lambda's so I'm not sure this is correct
    return d.sort(cmp = lambda x,y: cmp(d[x],d[y]))

print calculate_word_frequency(test)

Respuestas a la pregunta(6)

Su respuesta a la pregunta