优化代码 - Mathcad 与 Python 的比较
Optimizing code - Comparison between Mathcad and Python
SL_Only
、pandas 数据帧,包含来自 13K 个位置(记录)的三个发射器的信号
SL_Only
形状是 13722x3 所有数据类型都是 numeric
。
TxID_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 提供的矢量化操作。
SL_Only
、pandas 数据帧,包含来自 13K 个位置(记录)的三个发射器的信号
SL_Only
形状是 13722x3 所有数据类型都是 numeric
。
TxID_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 提供的矢量化操作。