python - 优化 Python 脚本以在 pandas DataFrame 上进行 200K 行迭代
问题描述
我编写了下面的代码来迭代数据帧(df_final_exheader),获取文件路径并从相应的图像中读取元数据。在这一点上感觉比它需要的要慢,但我很难找到解决方案(我有非程序员背景,可能缺乏基本知识)。
如果我是正确的,其中一个问题是使用.iterrows在数据帧上循环,阅读指南我认为我需要实现矢量化,但我不知道如何选择它。有人可以在正确的方向上轻轻推动我吗?
def read_dicom_header(input_dir_im, df_final_exheader):
i = 0
for row,index in df_final_exheader.iterrows():
ds = dicom.dcmread(os.path.join(input_dir_im,df_final_exheader.loc[row, 'path']))
header_dict = {'kVp':[0x18,0x60],'uAs':[0X18,0x1153],'EI':[0x18,0x1411],'DAP':[0x18,0x115E],'REX':[0x18, 0x1405]}
for key, val in header_dict.items():
try:
df_final_exheader.loc[row, key] = ds[[hex(x) for x in val]].value
except KeyError:
df_final_exheader.loc[row, key] = 'na'
i+=1
if i%500==0:
print(row)
return df_final_exheader
解决方案
在这种情况下,我似乎误解了矢量化的相关性。当前版本正在运行,完成后我会对其进行调整,看看可以改进到什么程度。
跟进; 我终于有时间在 timeit 下运行几个变种;
原始代码;2.654 秒。
按照@roganjosh 的建议移动了字典;2.618 秒。
排除@Cammeron Riddle 建议的像素数据;2.340 秒。
总结;原始脚本运行了 48 小时,经过修改后可以改进为 42 小时。
再次; 感谢大家的意见和建议!:)
推荐阅读
- python - AttributeError:“函数”对象在尝试从函数访问变量时没有属性错误
- apache-kafka - Flink 和非键控窗口状态
- java - 在映射超类中处理 Hibernate 持久性
- javascript - Eclipse IDE v2020-12 (4.18.0) 坚持我的 javascript 文件之一是 HTML 文件,并将每次使用 && 标记为无效字符
- python - Visual Studio Code 中的 Python Quandl 输出
- python - 使用正则表达式从 url 中提取日期
- c# - MVVM:如何从我在检查项目的列表视图中手动输入的文本框中检索值?
- asp.net-core - 在购物车中添加商品
- java - IntelliJ Java 类型渲染器用于带有原语的 Eclipse 集合
- google-sheets - 使用 google 查询作为数组公式,根据另一列中的信息对列中的值求和