由于您专门指定 CPU,因此可能值得考虑 pyFFTW 和 python 子进程。在过去,我已经成功地将数组拆分为子数组。然后为子数组的子集启动并发进程,这些子数组又将运行 pyFFTW 的实例。PyFFTW 是 FFTW 上的 python 包装器,根据我的经验,它比 numpy fft 快。请阅读有关启用缓存等以优化性能的 pyFFTW 文档。稍后我在工作计算机上时将在此处发布一些代码。但是有一个问题,太多的进程会减慢速度。下面是我一直在讨论的一个例子。fft_split 函数将问题(dat)拆分为 num_prcss 个进程,并让多个进程将它们作为一个批次进行处理。我在这里使用 pyFFTW,但如果您决定运行它,可以使用 numpy fft。
import numpy as np
import pyfftw as pyfftw
import multiprocessing as mp
import time as time
dat = np.random.rand(50000).reshape(50,-1)
num_prcss = 8
threads = 8
output = mp.Queue()
def fft_sub_process(dat_in, row, output):
match_out = pyfftw.interfaces.numpy_fft.ifft(dat_in, threads=threads)
match_abs = np.abs(match_out)
max_match_fltr = np.max(match_abs)
print([row, max_match_fltr])
output.put([row, max_match_fltr])
def fft_split(dat, num_prcss):
results = []
for r in xrange(0, dat.shape[-2], num_prcss):
if r == dat.shape[-2] - dat.shape[-2]%num_prcss:
processes = [mp.Process(target=fft_sub_process, args=(dat[row], row, output)) for row in xrange(r, r+dat.shape[-2]%num_prcss)]
for p in processes:
p.start()
for p in processes:
p.join()
results.append([output.get() for p in processes])
else:
processes = [mp.Process(target=fft_sub_process, args=(dat[row], row, output)) for row in xrange(r, r+num_prcss)]
for p in processes:
p.start()
for p in processes:
p.join()
results.append([output.get() for p in processes])
return results
t = time.time()
search_res = fft_split(dat, num_prcss)
elapsed = time.time() - t
print(elapsed)