优化代码 - Mathcad 与 Python 的比较

Optimizing code - Comparison between Mathcad and Python

SL_Only、pandas 数据帧,包含来自 13K 个位置(记录)的三个发射器的信号 SL_Only 形状是 13722x3 所有数据类型都是 numericTxID_L, pandas 数据帧,形状为 3x10,包含 SL_Only 中三个发射器的 10 个参数。

F_BW = [700, 2100, step_size=200] CF = [20, 120, step_size= 5] TxID = str ,可以是任何东西 SC_SL = TxID

中最好的

除了 TxIDs,所有值都是 numeric

SC_SL = '<Best column_name from SL_Only>'
row_arr = []

for _, r in tqdm(SL_Only.iterrows()):
    max_rsrp = SL_Only[SC_SL][_]
    max_txid = (r == max_rsrp).T.idxmax()
    paramax_cf = TxID_L[TxID_L['TxID'] == max_txid]['CF'].values
    paramax_bw = TxID_L[TxID_L['TxID'] == max_txid]['F_BW'].values
    col_arr = []
    for c in SL_Only.columns.values:
        rsrp = r[c]
        txid = (r == rsrp).T.idxmax()
        param_cf = TxID_L[TxID_L['TxID'] == txid]['CF'].values
        param_bw = TxID_L[TxID_L['TxID'] == txid]['F_BW'].values
        calc = rsrp + 10*np.log10(abs((paramax_cf+0.5*paramax_bw - param_cf+0.5*param_bw)/paramax_bw))
        col_arr.append(calc[0])
    row_arr.append(col_arr)

row_arr 需要 1.5 分钟来处理,而在 Mathcad 中只需要几分之一秒(我没有用过,但我的经理告诉我可以。)。

您能否在代码中找到错误,从而缩短处理时间

我写了一些代码来生成假输入,至少允许我 运行 你发布的代码不加修改:

import numpy as np
import pandas as pd

TxIDs = ['sensor1', 'sensor2', 'sensor3']
params = ['CF', 'F_BW']

nsensors = len(TxIDs)
nmeasurements = 13722

SL_Only = pd.DataFrame(np.random.uniform(size=(nmeasurements, nsensors)), columns=TxIDs)
TxID_L = pd.DataFrame(np.random.uniform(size=(nsensors, len(params))), columns=params)
TxID_L['TxID'] = TxIDs
SC_SL = 'sensor1'

在这些定义之后,运行使用您的代码(在我的机器上大约需要 45 秒)生成一个列表列表 row_arr。为了比较结果,我定义了

old_result = pd.DataFrame(row_arr, columns=SL_Only.columns.values)

以下代码复制您的结果,大约需要 0.2 秒:

TxID_L.set_index('TxID', inplace=True)

paramax_cf = TxID_L.loc[SC_SL, 'CF']
paramax_bw = TxID_L.loc[SC_SL, 'F_BW']
param_bw = TxID_L.loc[:, 'F_BW']
param_cf = TxID_L.loc[:, 'CF']

new_result = SL_Only + 10*np.log10(abs((paramax_cf+0.5*paramax_bw - param_cf+0.5*param_bw)/paramax_bw))

为了证实这一点,我

(new_result - old_result).abs().values.max()

我使用此代码编写的每个 运行 都返回零。

关键见解是尽可能多地做一次而不是循环,并使用 Pandas 提供的矢量化操作。