Sem ver o código e uma amostra dos dados, é praticamente impossível determinar a causa exata. O que dá pra afirmar com relativa certeza é que culpar a linguagem costuma ser uma das piores formas de resolver. Na grande maioria das vezes a culpa não é da linguagem, e sim daquela pecinha entre a cadeira e o teclado :-)
Enfim, a ideia de ter uma biblioteca em Python, que delega o serviço pesado para C ou C++ é tentar ter o "melhor" dos dois mundos: ganha-se a conveniência de uma delas (por exemplo, a sintaxe mais amigável - na minha opinião - de Python, além da facilidade de integrar com outras bibliotecas da linguagem), e a velocidade de outra (o Python serve como uma "casca" que por debaixo dos panos chama o código mais rápido/otimizado feito em outra linguagem mais adequada para tal tarefa).
Poderia fazer tudo em C? Sim, assim como poderia fazer tudo em Assembly - afinal, pra que escrever em C, e depois compilar pra só então ter o executável? Fazer um compilador é muito complicado, escreve o código de máquina direto.
Acho que o ponto aqui é conveniência. Linguagens diferentes podem dar níveis de abstração e facilidades que vc não teria com outras. Fazendo esta "casca" com Python, de quebra vc ganha a facilidade de integrar seu programa com todo o resto da linguagem (todas as outras libs existentes). Dependendo do que precisa, isso pode fazer diferença e ser melhor do que usar a mesma lib diretamente em C.