电脑 CPU 为 AMD Ryzen 7 6800H
,8 核 16 进程
系统为 Windows 11
任务为对一组数据做分段 FFT ,因为每段 FFT 相互无关,所以将整段数据分为 n_jobs
块后每块并行计算,试图加速(具体代码不能公开,正在整理一份能复现的代码)。但是发现了奇怪的情况,保持其他参数不变,使用 parallel = Parallel(n_jobs=int(n_jobs))
,当 n_jobs
大于 4 后,总体用时不会下降。
深入进程测试后发现每个进程内部的 for
循环内的代码拖慢了速度,代码如下(正常来说怎么测试每行代码的性能呢……望大佬指路!):
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
请问为什么会出现这种情况呢?有哪些办法能进一步提升性能呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.