
我们可以利用
broadcasting基于NumPy的解决方案-
ss = np.exp(1j*(ph[:,None] + fre[:,None]*tau))
将此移植
numexpr以利用快速
transcendental*** 作以及多核功能-
import numexpr as nedef numexpr_soln(ph, fre): ph2D = ph[:,None] fre2D = fre[:,None] return ne.evaluate('exp(1j*(ph2D + fre2D*tau))')时间-
In [23]: num_row, num_col = 6000, 13572 ...: ss = np.ones((num_row, num_col), dtype=np.complex128) ...: ph = np.random.standard_normal(num_row) ...: fre = np.random.standard_normal(num_row) ...: tau = np.random.standard_normal(num_col)# Original solnIn [25]: %%timeit ...: for idx in range(num_row): ...: ss[idx, :] *= np.exp(1j*(ph[idx] + fre[idx]*tau))1 loop, best of 3: 4.46 s per loop# Native NumPy broadcasting solnIn [26]: %timeit np.exp(1j*(ph[:,None] + fre[:,None]*tau))1 loop, best of 3: 4.58 s per loop
对于具有不同数量的内核/线程的Numexpr解决方案-
# Numexpr solution with # of threads = 2In [51]: ne.set_num_threads(nthreads=2)Out[51]: 2In [52]: %timeit numexpr_soln(ph, fre)1 loop, best of 3: 2.18 s per loop# Numexpr solution with # of threads = 4In [45]: ne.set_num_threads(nthreads=4)Out[45]: 4In [46]: %timeit numexpr_soln(ph, fre)1 loop, best of 3: 1.62 s per loop# Numexpr solution with # of threads = 8In [48]: ne.set_num_threads(nthreads=8)Out[48]: 8In [49]: %timeit numexpr_soln(ph, fre)1 loop, best of 3: 898 ms per loop
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)