Por que o ordenamento de dicionários não é determinístico?

Eu mudei recentemente do Python 2.7 para o Python 3.3, e parece que enquanto no Python 2 a ordenação das chaves do dicionário era arbitrária mas consistente, no Python 3 a ordenação das chaves de um dicionário obtido com, por exemplo,vars() parece não determinista.

Se eu corro:

class Test(object): pass
parameters = vars(Test)
print(list(parameters.keys()))

tanto no Python 2.7 como no Python 3.3, então:

Python 2.7 consistentemente me dá

['__dict__', '__module__', '__weakref__', '__doc__']

Com o Python 3.3, posso obter qualquer ordem aleatória - por exemplo:

['__weakref__', '__module__', '__qualname__', '__doc__', '__dict__']
['__doc__', '__dict__', '__qualname__', '__module__', '__weakref__']
['__dict__', '__module__', '__qualname__', '__weakref__', '__doc__']
['__weakref__', '__doc__', '__qualname__', '__dict__', '__module__']

De onde vem esse não-determinismo? E porque é algo como

list({str(i): i for i in range(10)}.keys())

… Consistente entre as corridas, sempre dando

['3', '2', '1', '0', '7', '6', '5', '4', '9', '8']

…?

questionAnswers(2)

yourAnswerToTheQuestion