a eficiência da memória quando expondo C struct com Cython

votos
2

Eu estou olhando para usar Cython para reduzir os requisitos de memória de uma estrutura de dados que são armazenados em um Python milhões de dicionário de vezes. Agora, eu implementei isso como uma classe simples Cython em um arquivo pyx:

cdef class FooBar:
    cdef public int x
    cdef public int y

    def __init__(self, x, y):
        self.x = x
        self.y = y

Eu uso isso em outro arquivo pyx para preencher um dicionário Python que tem milhões de chaves:

python_dict[key] = FooBar(x, y)

Isto proporciona uma poupança de memória substanciais, em comparação com usando um namedtuple ou outra solução pitão como os estabelecimentos de classe reais 6 inteiros e, portanto, necessária 40 bytes de memória (6 * 4 + 16 bytes para PyObject_Head). No entanto, a sobrecarga de 16 bytes é substancial e minha pergunta é se existe uma maneira melhor de fazer isso. O meu entendimento é que eu não posso expor diretamente um struct C uma vez que este seria tipo fundido a um dicionário Python exigindo muito mais memória. O dicionário python_dict é usado extensivamente no meu código principalmente Python. Existe uma maneira de evitar a sobrecarga PyObject_Head sem ter que mover um monte de implementação ao longo de Cython pura / C?

Publicado 27/11/2018 em 18:00
fonte usuário
Em outras línguas...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more