Sugestões para acelerar o cálculo da distância

Considere a seguinte classe:

class SquareErrorDistance(object):
    def __init__(self, dataSample):
        variance = var(list(dataSample))
        if variance == 0:
            self._norm = 1.0
        else:
            self._norm = 1.0 / (2 * variance)

    def __call__(self, u, v): # u and v are floats
        return (u - v) ** 2 * self._norm

Eu o uso para calcular a distância entre dois elementos de um vetor. Basicamente, crio uma instância dessa classe para todas as dimensões do vetor que usam essa medida de distância (existem dimensões que usam outras medidas de distância). A criação de perfil revela que o__call__ A função dessa classe é responsável por 90% do tempo de execução da minha implementação do knn (quem teria pensado). Eu não acho que existe alguma maneira pura de Python para acelerar isso, mas talvez se eu implementá-lo em C?

Se eu executar um programa C simples que apenas calcula distâncias para valores aleatórios usando a fórmula acima, é uma ordem de magnitude mais rápida que o Python. Então eu tentei usarctypes e chame uma função C que faça o cálculo, mas, aparentemente, a conversão dos parâmetros e valores de retorno é muito cara, porque o código resultante é muito mais lento.

É claro que eu poderia implementar todo o knn em C e simplesmente chamar isso, mas o problema é que, como descrevi, utilizo diferentes funções de distância para alguma dimensão dos vetores, e traduzi-las para C seria muito trabalhoso.

Então, quais são minhas alternativas? Escrevendo a função C usando oAPI C do Python se livrar da sobrecarga? Existem outras maneiras de acelerar esse cálculo?

questionAnswers(2)

yourAnswerToTheQuestion