ArcPy script with cursors running slow?

المشرف العام

Administrator
طاقم الإدارة
I've got 2 polygons layers (no gaps): IDUs and crops. What I want is to identify the 3 largest crops by % area for each IDU. This seems common enough but I couldn't find a way to do it all using tools, so I decided to try and learn basic arcpy to finish the job. I'm in ArcGIS 10.1 SP 1 (Advanced) and have done lots of PHP but this is my first try at python.

I found the Tablulate Intersections tool which works great and gives a table with all the overlapping crops with area and %area fields, but I want to add attributes to the IDU layer for the 3 largest crop codes - eg. LU_1=123, LU_2=201, LU_3=132. Here's the script I wrote. It works, but it's taking 100sec to process 160 test IDU records, and eventually it needs to process 100,000. I've got a 2013 Retina MacBookPro which flies through everything else I've thrown in in Arc so far, so something is obviously poorly done in my code.

import arcpy idusFC = "c:/Envision/StudyAreas/PEI-Dev/NewIDUs/PEI.gdb/IDUs_Test" cropTB = "c:/Envision/StudyAreas/PEI-Dev/NewIDUs/PEI.gdb/IDU_CROP2011_table_Sort1" iduFields = ["CROP2011_A_Code", "CROP2011_B_Code", "CROP2011_C_Code", "IDU_ID"] cropsFields = ["CROP_2011_GRIDCODE"] print "Starting processing" start = time.time() with arcpy.da.UpdateCursor(idusFC, iduFields) as idus: for idu in idus: itr = 0 iduID = idu[3] whereClause = arcpy.AddFieldDelimiters(cropTB, "IDU_ID") + " = " + str(iduID) with arcpy.da.SearchCursor(cropTB, cropsFields, where_clause=whereClause) as iducrops: for iducrop in iducrops: idu[itr] = iducrop[0] itr += 1 if itr > 2: break idus.updateRow(idu) end = time.time() processTime = end - start print "Processing Completed - {:.1f} seconds".format(processTime) Is there another way I should do this so that it runs reasonably fast?



أكثر...
 
أعلى