Eu tenho trabalhado com integração de C++ (e as vezes C) com Python nos últimos meses. A maioria dos códigos que eu tenho em produção são escritos ou em Swig[1] ou em Boost::Python[2].
Ambas soluções são bacanas quando você tem um código que irá crescer constantemente, pois é muito fácil criar uma nova camada e ir adicionando componentes no seu código. Mas tem um porém nessas soluções: você ta enfiando dependência no seu projeto que não é tão direto de instalar, isso pode te dar dor de cabeça com os usuários.
Um exemplo que acontece aqui comigo é: muitos usuários do nosso framework não são programadores, mas sim físicos e engenheiros que usam o framework para desenvolver modelos. Por mais boa vontade que esses caras tenham, vira e mexe aparece um que não consegui instalar o Swig, ou que tem problema compilando Boost... Aí até conseguirmos dar suporte o cara perde meio dia de trabalho. Então isso é uma variável que você tem que por na balança: quem vai usar o seu código vai precisar compilá-lo? Se sim, esse tipo de usuário consegue se virar sozinho?
Atualmente eu estou portando o maior projeto daqui de Boost para usar a API padrão do Python[3] e Cython (em camadas diferentes). O core do framework, que é um código bem compacto e sólido, eu estou escrevendo usando a API padrão do Python. Motivo: é um código super compact, que não vai ficar crescendo exponencialmente ao longo do tempo, então eu não preciso me preocupar tanto com manutenção, escalabilidade de implementação, esses trens.
Já as bibliotecas do usuário eu estou escrevendo em Cython[4], por uma série de motivos: 1- a quantidade de componentes da minha bibliteca cresce ao longo do tempo, então fica complicado usar a API padrão. 2 - O usuário pode criar sua própria biblioteca de componente baseado em alguns "templates", apenas preenchendo métodos de componentes vazios. Usando Cython o cara pode fazer isso escrevendo código Python mesmo, não precisa se preocupar com C ou C++, a menos que ele queira. 3 - O usuário pode quere criar uma biblioteca e compilar para C, apenas com o intuito de proteger o código fonte do seu componente (sim, dá pra descompilar isso, mas dá mais trabalho).
No mais, se o seu foco for desempenho, vale a pena tentar o Pypy[5]. Se você usa muitas operações mateáticas, tenta a versão de Numpy e SciPy compilada diretamente para Cython[6], ela é bem mais rápida que a versão original da Numpy, se usada corretamente.
--
Atenciosamente,
Antonio Ribeiro
Skype: alvesjnr