Сделайте Pyfftw быстрее, чем Scipy ConvolvePython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Сделайте Pyfftw быстрее, чем Scipy Convolve

Сообщение Anonymous »

У меня есть простая функция, которая выполняет продукт скользящей точки, используя подход свертывания перекрытия: < /p>

Код: Выделить всё

import numpy as np
from scipy.signal import oaconvolve
import pyfftw
import os

def scipy_sliding_dot(A, B):
m = A.shape[0]
n = B.shape[0]
Ar = np.flipud(A)  # Reverse/flip A
AB = oaconvolve(Ar, B)

return AB.real[m - 1 : n]
< /code>
Для справки, это то же самое, что и делать: < /p>
def naive_sliding_dot(A, B):
m = len(A)
n = len(B)
l = n - m + 1
out = np.empty(l)
for i in range(l):
out[i] = np.dot(A, B[i:i+m])
return out
< /code>
Когда я инициализации двух случайных (всегда реальных, никогда не сложных) массивов: < /p>
A = np.random.rand(2**6)
B = np.random.rand(2**20)
, а затем Time scipy_sliding_dot с:

Код: Выделить всё

%timeit scipy_sliding_dot(A, B)
< /code>
Я получаю: < /p>
6.39 ms ± 38.2 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Я затем пытаюсь ускорить это с помощью многопоточного pyfftw :

Код: Выделить всё

class pyfftw_sliding_dot(object):
# Based on https://stackoverflow.com/a/30615425/2955541
def __init__(self, A, B, threads=1):
shape = (np.array(A.shape) + np.array(B.shape))-1
self.rfft_A_obj = pyfftw.builders.rfft(A, n=shape, threads=threads)
self.rfft_B_obj = pyfftw.builders.rfft(B, n=shape, threads=threads)
self.irfft_obj = pyfftw.builders.irfft(self.rfft_A_obj.output_array, n=shape, threads=threads)

def __call__(self, A, B):
m = A.shape[0]
n = B.shape[0]
Ar = np.flipud(A)  # Reverse/flip A
rfft_padded_A = self.rfft_A_obj(Ar)
rfft_padded_B = self.rfft_B_obj(B)

return self.irfft_obj(np.multiply(rfft_padded_A, rfft_padded_B)).real[m - 1 : n]
< /code>
Тогда я проверяю производительность с помощью: < /p>
n_threads = os.cpu_count()
obj = pyfftw_sliding_dot(A, B, n_threads)
%timeit obj(A, B)
< /code>
и get: < /p>
33 ms ± 347 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)
Это означает, что многопоточный pyfftw ~ 5x медленнее, чем scipy . Я проложил документацию «Строители» и разыгрывал со всеми «дополнительными аргументами» (например, Planner_effort , Toverwrite_input и т. Д.), Но производительность pyfftw не меняется.
Что я делаю не так с pyfftw и как я могу сделать его быстрее, чем scipy ?

Подробнее здесь: https://stackoverflow.com/questions/794 ... y-convolve
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Расхождение между C ++ FFTW и Pyfftw
    Anonymous » » в форуме Python
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Расхождение между C ++ FFTW и Pyfftw
    Anonymous » » в форуме C++
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Fftshift или convolve из модуля NumPy некорректно работают
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Fftshift или convolve из модуля NumPy некорректно работают
    Anonymous » » в форуме Python
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • Fftshift или convolve из модуля NumPy некорректно работают
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»