不久前,我编写了一个快速的Python函数,用于将属性表转换为python字典,其中的键来自用户指定的唯一ID字段(通常是OID字段)。另外,默认情况下,所有字段都复制到字典中,但是我包含了一个参数,只允许指定一个子集。
def make_attribute_dict(fc, key_field, attr_list=['*']):
dict = {}
fc_field_objects = arcpy.ListFields(fc)
fc_fields = [field.name for field in fc_field_objects if field.type != 'Geometry']
if attr_list == ['*']:
valid_fields = fc_fields
else:
valid_fields = [field for field in attr_list if field in fc_fields]
if key_field not in valid_fields:
cursor_fields = valid_fields + [key_field]
else:
cursor_fields = valid_fields
with arcpy.da.SearchCursor(fc, cursor_fields) as cursor:
for row in cursor:
key = row[cursor_fields.index(key_field)]
subdict = {}
for field in valid_fields:
subdict[field] = row[cursor_fields.index(field)]
dict[key] = subdict
del subdict
return dict
这对于相对较小的数据集来说效果很好,但是我只是在包含约750,000行和15个字段的表上运行了它-在文件地理数据库中大约有100MB。在这些函数上,该函数的运行速度比我预期的要慢得多:大约5-6分钟(这是在将表复制到in_memory
工作区之后)。我真的很想找到一种方法来加快向字典的转换,或者对使用Python处理大量属性数据的更好策略有一些了解。
UpdateCursors对我来说效果不佳,因为当一行更改时,它有可能触发其他几行的更改。一次遍历一次并处理它们对于我需要的来说太麻烦了。
2
可以优化脚本多少的限制因素可能是迭代游标所花费的时间长度。您是否比较了在不构建字典的情况下遍历光标所花费的时间?
—
杰森
@Jason注释出从线
—
nmpeterson
subdict = {}
通过del subdict
产率的约10秒的处理时间。
您可能比我更了解这一点,但是在优化方面,我唯一要提供的其他内容是查看调用
—
杰森
subdict[field] = row[cursor_fields.index(field)]
是否比调用更快subdict[field] = row.getValue(field)
。在后一种情况下,您将执行一个步骤...尽管索引两个列表(cursor_fields
和row
)与使用单个ESRI流程之间的性能差异可能不会好很多,甚至可能更糟!