电脑 CPU 为 `AMD Ryzen 7 6800H` ,8 核 16 进程
系统为 `Windows 11`
任务为对一组数据做分段 FFT ,因为每段 FFT 相互无关,所以将整段数据分为 `n_jobs` 块后每块并行计算,试图加速(具体代码不能公开,正在整理一份能复现的代码)。但是发现了奇怪的情况,保持其他参数不变,使用 `parallel = Parallel(n_jobs=int(n_jobs))` ,当 `n_jobs` 大于 4 后,总体用时不会下降。
![代码性能测试]( https://i.piantu.cn/i/0/2024/10/67161a5318fea.png)
深入进程测试后发现每个进程内部的 `for` 循环内的代码拖慢了速度,代码如下(正常来说怎么测试每行代码的性能呢……望大佬指路!):
```python
tCost = []
for i in batchTask:
tCost.append([time.time()])
startTime = sampleDot[0] + i * step
endTime = startTime + step
splitSampleDot = sampleDot[
np.where((sampleDot >= startTime) & (sampleDot < endTime))
]
tCost[-1].append(time.time() - tCost[-1][0]) # ckpt t0
splitData = np.array(list(zip(splitSampleDot, linearData(splitSampleDot))))
tCost[-1].append(time.time() - tCost[-1][0]) # ckpt t1
signal, powerDensity = getFftResult(
splitData,
splitSampleDot,
float(sampleRate),
0.0,
0.8,
float(minFreq),
)
tCost[-1].append(time.time() - tCost[-1][0]) # ckpt t2
powerDensity[powerDensity < displayThreshold] = np.nan
tCost[-1].append(time.time() - tCost[-1][0]) # ckpt t3
fftDataList.append(powerDensity)
fftFreqList.append(signal)
fftStartTimeList.append(datetime.fromtimestamp(startTime))
tCost[-1].append(time.time() - tCost[-1][0]) # ckpt t4
realTimeDateObjList.append(
mdates.date2num(np.vectorize(datetime.fromtimestamp)(splitSampleDot))
)
tCost[-1].append(time.time() - tCost[-1][0]) # ckpt t5
```
请问为什么会出现这种情况呢?有哪些办法能进一步提升性能呢? |
|