Python переплетается ненормально медленно при использовании calloc

Я использую следующий код, чтобы сделать прямую-обратную FIR-фильтрацию на месте:

lena = len(a)
lenb = len(b)
convol = zeros(a.shape)

code = """// Forward convolution
int pad = (lenb-1)/2;
int i, j;

for (i=pad; i<pad+lena; i++)
{
int kmin, kmax, k;
// Reverse indexing for the next pass
j = lena-1-i+pad;

convol(j)  = 0;

kmin = (i >= lenb - 1) ? i - (lenb - 1) : 0;
kmax = (i <  lena - 1) ? i : lena - 1;

for (k = kmin; k <= kmax; k++)
{
convol(j)  += a(k)*b(i - k);
}
}// Backward convolution (the signal in convol has been
// reversed using reversed indexes)
for (i=pad; i<pad+lena; i++)
{
int kmin, kmax, k;
// Reverse indexing for reordering the output vector
j = lena-1-i+pad;

a(j)  = 0;

kmin = (i >= lenb - 1) ? i - (lenb - 1) : 0;
kmax = (i <  lena - 1) ? i : lena - 1;

for (k = kmin; k <= kmax; k++)
{
a(j)  += convol(k)*b(i - k);
}
}
return_val = 1;
"""
weave.inline(code, [ 'a', 'b', 'lena', 'lenb', 'convol'],
type_converters=converters.blitz, compiler = 'g++')

Конечно, переменную «convol» не нужно видеть вне области видимости C / C ++, и мне нужны как пространство, так и оптимальность обработки. Таким образом, имеет смысл (по крайней мере для меня) заменить этот код следующим:

lena = len(a)
lenb = len(b)

code = """// Forward convolution
int pad = (lenb-1)/2;
int i, j;

float* convol = (float*) calloc(lena, sizeof(float));

for (i=pad; i<pad+lena; i++)
{
int kmin, kmax, k;
// Reverse indexing for the next pass
j = lena-1-i+pad;

convol[j]  = 0;

kmin = (i >= lenb - 1) ? i - (lenb - 1) : 0;
kmax = (i <  lena - 1) ? i : lena - 1;

for (k = kmin; k <= kmax; k++)
{
convol[j]  += a(k)*b(i - k);
}
}// Backward convolution (the signal in convol has been
// reversed using reversed indexes)
for (i=pad; i<pad+lena; i++)
{
int kmin, kmax, k;
// Reverse indexing for reordering the output vector
j = lena-1-i+pad;

a(j)  = 0;

kmin = (i >= lenb - 1) ? i - (lenb - 1) : 0;
kmax = (i <  lena - 1) ? i : lena - 1;

for (k = kmin; k <= kmax; k++)
{
a(j)  += convol[k]*b(i - k);
}
}

free(convol);

return_val = 1;
"""
weave.inline(code, [ 'a', 'b', 'lena', 'lenb'],
type_converters=converters.blitz, compiler = 'g++')

Где единственное различие заключается в том, что вместо использования простого массива я использовал непосредственно массив с плавающей запятой. Проблема в том, что второй код обрабатывается примерно в 2 раза дольше, чем первый … почему? Что-то не так во второй версии? Это должно быть быстрее …!

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]