Profile First
"Profile First", Django Docs
Não aplique soluções aleatoriamente, descubra o gargalo, meça, compare o ganho.
A seguir uma lista de ferramentas que você pode usar para fazer profilling de aplicações Django.
Django Debug-Toolbar
O Django Debug-Toolbar é a ferramenta mais famosa para profilling com Django. Possui uma série de painéis (que são extensíveis), mostrando informações diversas de profilling, como o tempo de geração da página e número de consultas.

Django devserver
O Django devserver mostra as informações na saída padrão do manage.py runserver, também é extensível, possui por exemplo, profilling de consultas, memória, tempo de geração da página.

Django extensions
O Django extensions é uma app que traz diversas utilidades, uma delas é um profiler que gera output no formato do cProfile de um ciclo de requisição, que pode ser lido com o módulo pstats. O mais legal do Django extensions é que há a opção de formatar o output no formato do kcachegrind, facilitando muito a visualização.
Ele é especialmente útil em casos que o gargalo não é nas consultas. Com ele é fácil visualizar quais funções e métodos estão tomando mais tempo.
Ex:
python manage.py runprofileserver --kcachegrind --prof-path=/tmp/my-profile-data
Exemplo de output com o kcachegrind

Middleware de profilling
Há vários middleware de profilling, que podem ser encontratos no djangosnippets. Eles basicamente mostram na tela do navegador o resultado, no formato do cProfile. Também é possível ver número de consultas, consultas repetidas etc.
Algo interessante desse tipo de método, é que pode ser executado em ambiente de homologação, sem que atrapalhe a visualização dos dados ou que exija modificação no deploy.

No shell: Ipython
Para diversas itens pontuais, o shell do django com o Ipython ajuda muito. Com o comando %prun, ele gera o output no formato do cProfile, é muito fácil de usar e útil para por exemplo, achar gargalos de uma função específica.
Ex:
%prun alguma_funcao()
Outra função útil, dessa vez do django é o db.connection.queries, que mostra as consultas executadas no contexto atual, fica fácil ver se um método específico está gerando mais consultas que deveria.

Conclusão
Esse post não tem grandes pretensões além de listar ferramentas de profilling para o Django. Fazer profilling é importante, com o ORM Django, é fácil gerar consultas desnecessárias e repetidas, o que pode influenciar na experiência do usuário, mesmo em serviços com pouquíssimo acesso.
Em uma próxima postagem, pretendo mostrar, uma vez identificado os gargalos, técnicas disponíveis no Django para contorná-los.