【发布时间】:2016-06-19 07:29:42
【问题描述】:
tl;博士
对于相同的numpy 数组,计算np.cos 需要3.2 秒,而np.sin 在Linux Mint 上运行548 秒(九分钟)。
完整代码见this repo。
我有一个脉冲信号(见下图),我需要将其调制到 HF 载波上,模拟Laser Doppler Vibrometer。因此需要对信号及其时基进行重采样以匹配载波更高的采样率。
在接下来的解调过程中,同相载波cos(omega * t)和相移载波sin(omega * t)都是需要的。
奇怪的是,评估这些函数的时间很大程度上取决于计算时间向量的方式。
时间向量t1直接使用np.linspace计算,t2使用method implemented in scipy.signal.resample。
pulse = np.load('data/pulse.npy') # 768 samples
pulse_samples = len(pulse)
pulse_samplerate = 960 # 960 Hz
pulse_duration = pulse_samples / pulse_samplerate # here: 0.8 s
pulse_time = np.linspace(0, pulse_duration, pulse_samples,
endpoint=False)
carrier_freq = 40e6 # 40 MHz
carrier_samplerate = 100e6 # 100 MHz
carrier_samples = pulse_duration * carrier_samplerate # 80 million
t1 = np.linspace(0, pulse_duration, carrier_samples)
# method used in scipy.signal.resample
# https://github.com/scipy/scipy/blob/v0.17.0/scipy/signal/signaltools.py#L1754
t2 = np.arange(0, carrier_samples) * (pulse_time[1] - pulse_time[0]) \
* pulse_samples / float(carrier_samples) + pulse_time[0]
如下图所示,时间向量并不相同。在 8000 万个样本中,t1 - t2 的差异达到了 1e-8。
在我的机器上计算t1 的同相和偏移载波分别需要 3.2 秒。
但是,对于 t2,计算偏移载波需要 >540 秒。九分钟。对于几乎相同的 8000 万个值。
omega_t1 = 2 * np.pi * carrier_frequency * t1
np.cos(omega_t1) # 3.2 seconds
np.sin(omega_t1) # 3.3 seconds
omega_t2 = 2 * np.pi * carrier_frequency * t2
np.cos(omega_t2) # 3.2 seconds
np.sin(omega_t2) # 9 minutes
我可以在运行 Linux Mint 17 的 32 位笔记本电脑和 64 位塔式电脑上重现此错误。然而,在我室友的 MacBook 上,“慢正弦”所需的时间与其他三个计算一样少。
我在 64 位 AMD 处理器上运行 Linux Mint 17.03,在 32 位 Intel 处理器上运行 Linux Mint 17.2。
【问题讨论】:
-
如果切换调用这些的顺序,结果是否一致? (只是假设这可能是由于某种内存/缓存问题 - 每一个都会产生一个 640MB 的向量。)
-
@OliverCharlesworth 是的,结果是一样的
-
numpy 链接的库是否在计算机之间有所不同?
-
@MSeifert 我该如何检查?
-
numpy.__config__.show()
标签: python numpy scipy signal-processing