在DataFrame上优化用于200K行迭代的Python脚本
我编写了下面的代码来迭代数据帧(df_final_exheader),获取文件路径并从相应的图像读取元数据。在这一点上,我感觉比需要的慢,但我很难找到解决方案(我有非程序员背景,可能缺乏基本知识) 如果我是正确的,其中一个问题是使用.iterrows,reading Guide在数据帧上循环。我认为我需要实现矢量化,但我不知道如何处理这个问题。有人能帮我朝正确的方向轻轻推一下吗在DataFrame上优化用于200K行迭代的Python脚本,python,pandas,dataframe,Python,Pandas,Dataframe,我编写了下面的代码来迭代数据帧(df_final_exheader),获取文件路径并从相应的图像读取元数据。在这一点上,我感觉比需要的慢,但我很难找到解决方案(我有非程序员背景,可能缺乏基本知识) 如果我是正确的,其中一个问题是使用.iterrows,reading Guide在数据帧上循环。我认为我需要实现矢量化,但我不知道如何处理这个问题。有人能帮我朝正确的方向轻轻推一下吗 def read_dicom_header(input_dir_im, df_final_exheader):
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的建议,Dict提出动议;2.618秒
- 不包括@Cammeron Riddle建议的像素数据;2.340秒
再次;谢谢大家的意见!:) 毫无疑问,我很确定你无法将其矢量化,因为它正在调用外部库来读取文件。一个超小型的改进是将
头目录
从循环中拉出,无需继续重新定义它。为了澄清,df\u final\u exheader是一个包含200k DICOM路径的数据帧?必须加载每个标签,并检查指定标签的标题?我觉得我一定是误会了什么。我的猜测是,用dicom.dcmread()加载dicom是一个瓶颈,但不幸的是,我认为这方面没有什么可做的。如果您只需要dicom文件中的一些元数据,也许你可以试着在打电话时加入stop\u before\u pixels=True
,我同意其他评论的说法,读dicom可能会让你慢下来,而不是数据帧迭代。谢谢大家的输入,我担心在这种情况下我可能会误解矢量化的相关性@roganjosh说的对,我需要注意一下。这个脚本已经运行了一整夜,大约是整个过程的1/3,考虑到你的评论,我会让它运行,然后尝试调整,只是为了从中学习!