Extendendo Python com cTypes

Postado por Rafael Sierra em 2/02/2007

Esses dias tive que implementar algumas coisas em C, por dois motivos, primeiro eu queria comparar a velocidade da mesma aplicação em duas linguagens (Python e C) e segundo, já estava na hora de começar a usar C com Python ;) .

Os primeiros testes que fiz (com a ajuda do Gean) foi usando a documentação oficial do Python que pode ser encontrada aqui. Foi relativamente fácil e não tive muitos (mais do que nenhum) problemas.

Porém a perfomance não era a esperada, então parti para outros testes, e um desses foi exatamente sobre a biblioteca ctypes. Atualmente ela é um pacote "third-part" (feito por terceiros), porém, será builtin na versão 2.5 :)

Sua instalação é simples e seu uso mais ainda.

Então vamos aos códigos, nós vamos fazer a clássica função fatorial. Pra começar precisamos definir os arquivos:

  • teste_fatorial.py Arquivo que vai chamar a função em C
  • fatorial.c Código que contém o algorítimo da função

Aqui está a implementação dos arquivos:

fatorial.c
[c]
/*
* Pra compilar esse codigo como biblioteca usando o GCC execute:
* gcc -o fatorial.so -shared fatorial.c
*/
#include

int
fatorial(int numero, int mult)
{
if (numero == 1)
{
return mult;
}
else
{
return fatorial(--numero, mult*numero);
}

}
[/c]

teste_fatorial.py
[python]
import ctypes

# A biblioteca tem que estar no mesmo diretorio do teste_fatorial.py
Fatorial = ctypes.CDLL("./fatorial.so")

# Seta o retorno da funcao para inteiro
Fatorial.fatorial.restype = ctypes.c_int

# Imprime o resultado da funcao
print Fatorial.fatorial(5, 1)
[/python]

Como você pode ver, nenhuma alteração no código em C precisa ser feita, você pode importar qualquer modulo pré-compilado que já exista, como a libc, a libgd e muitas outras já existentes no Linux.

Depois de carregar uma biblioteca, é recomendável que você altere o restype das funções que você vai chamar, por exemplo, no exemplo do fatorial eu setei para c_int, pois isso é o que a função retorna, um inteiro. Essa e outras observações você encontra na documentação do ctypes e na página do Python

Sem comentários (ainda) para “Extendendo Python com cTypes”

  1. Gabriel disse em 2/02/2007 as 20:46

    fudido |_|

  2. [Yy]oshio disse em 2/02/2007 as 10:14

    Não esquece que dados alocados dinamicamente(malloc) devem ser desalocados pois o Python não faz isso.
    Mas o ctypes é macumba da braba!

    Sabia que C é f#da?
    C é o cara.
    C tembrochove?

Trackback URI | RSS dos comentários

Deixe um comentário

Av. Conselheiro Nébias, 368A, Cj. 413
Vila Mathias - Santos - SP
Telefone: (13) 3345-4580

© 2008 - 2009 Stiod. Todos os direitos reservados.