No manual python 2 :
Detalhe de implementação do CPython: Objetos de tipos diferentes, exceto números, são ordenados por seus nomes de tipo; objetos do mesmo tipo que não suportam comparação adequada são ordenados por seus endereços.
Quando você solicita duas sequências ou dois tipos numéricos, a ordenação é feita da maneira esperada (ordenação lexicográfica para sequência, ordenação numérica para números inteiros).
Quando você solicita um tipo numérico e um não numérico, o tipo numérico é o primeiro.
>>> 5 < 'foo'
True
>>> 5 < (1, 2)
True
>>> 5 < {}
True
>>> 5 < [1, 2]
True
Quando você solicita dois tipos incompatíveis em que nenhum deles é numérico, eles são ordenados pela ordem alfabética de seus nomes de tipos:
>>> [1, 2] > 'foo' # 'list' < 'str'
False
>>> (1, 2) > 'foo' # 'tuple' > 'str'
True
>>> class Foo(object): pass
>>> class Bar(object): pass
>>> Bar() < Foo()
True
Uma exceção são as classes de estilo antigo que sempre vêm antes das classes de novo estilo.
>>> class Foo: pass # old-style
>>> class Bar(object): pass # new-style
>>> Bar() < Foo()
False
Esse comportamento é determinado pelas especificações de idioma ou depende dos implementadores?
Não há especificação de idioma . A referência de idioma diz:
Caso contrário, objetos de tipos diferentes sempre se comparam desiguais e são ordenados de maneira consistente, mas arbitrária.
Portanto, é um detalhe de implementação.
Existem diferenças entre as principais implementações do Python?
Não consigo responder a essa pergunta porque usei apenas a implementação oficial do CPython, mas existem outras implementações do Python, como o PyPy.
Existem diferenças entre as versões da linguagem Python?
No Python 3.x, o comportamento foi alterado para que a tentativa de solicitar um número inteiro e uma sequência de caracteres gere um erro:
>>> '10' > 5
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
'10' > 5
TypeError: unorderable types: str() > int()