Hello,
I have the following script. It works as expected, but it takes around 1.5 seconds to run each time. Doesn't seem to matter if it's running against 20 parcels or 5000. Are there any suggestions as to how I can improve the performance of this script.
Thanks
<SPAN class="keyword token">import</SPAN> arcpy
<SPAN class="keyword token">import</SPAN> numpy <SPAN class="keyword token">as</SPAN> np
<SPAN class="keyword token">try</SPAN><SPAN class="punctuation token">:</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>overwriteOutput <SPAN class="operator token">=</SPAN> <SPAN class="token boolean">True</SPAN>
<SPAN class="comment token">#Create in memory tables:</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>CreateTable_management<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"in_memory"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"tableSelRecs"</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddField_management<SPAN class="punctuation token">(</SPAN>r<SPAN class="string token">'in_memory\tableSelRecs'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"USE_CATEGORY"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"TEXT"</SPAN><SPAN class="punctuation token">,</SPAN> field_length<SPAN class="operator token">=</SPAN><SPAN class="number token">35</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddField_management<SPAN class="punctuation token">(</SPAN>r<SPAN class="string token">'in_memory\tableSelRecs'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"SHAPE_Area"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"Double"</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>CreateTable_management<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"in_memory"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"tableSumRecs"</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddField_management<SPAN class="punctuation token">(</SPAN>r<SPAN class="string token">'in_memory\tableSumRecs'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"USE_CATEGORY"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"TEXT"</SPAN><SPAN class="punctuation token">,</SPAN> field_length<SPAN class="operator token">=</SPAN><SPAN class="number token">35</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddField_management<SPAN class="punctuation token">(</SPAN>r<SPAN class="string token">'in_memory\tableSumRecs'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"SHAPE_Area"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"Double"</SPAN><SPAN class="punctuation token">)</SPAN>
mxd <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>mapping<SPAN class="punctuation token">.</SPAN>MapDocument<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'CURRENT'</SPAN><SPAN class="punctuation token">)</SPAN>
df <SPAN class="operator token">=</SPAN> mxd<SPAN class="punctuation token">.</SPAN>activeDataFrame
totalArea <SPAN class="operator token">=</SPAN> <SPAN class="number token">0</SPAN>
totalResArea <SPAN class="operator token">=</SPAN> <SPAN class="number token">0</SPAN>
totalParcels <SPAN class="operator token">=</SPAN> <SPAN class="number token">0</SPAN>
totalResParcels <SPAN class="operator token">=</SPAN> <SPAN class="number token">0</SPAN>
lu_layer <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>mapping<SPAN class="punctuation token">.</SPAN>ListLayers<SPAN class="punctuation token">(</SPAN>mxd<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"LandUse_UseCategory"</SPAN><SPAN class="punctuation token">,</SPAN> df<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="comment token">#use da.SearchCursor to access necessary fields from selected records</SPAN>
<SPAN class="keyword token">with</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>SearchCursor<SPAN class="punctuation token">(</SPAN>lu_layer<SPAN class="punctuation token">,</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="string token">'USE_CATEGORY'</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">'SHAPE@AREA'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">as</SPAN> cursor<SPAN class="punctuation token">:</SPAN>
<SPAN class="comment token">#Setup insert cursor to insert selected polygons into tableSelRecs</SPAN>
insCursor <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>InsertCursor<SPAN class="punctuation token">(</SPAN>r<SPAN class="string token">'in_memory\tableSelRecs'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">'USE_CATEGORY'</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">'SHAPE_Area'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#Isert selected rows into insCursor;</SPAN>
<SPAN class="comment token">#Get total area of selected records;</SPAN>
<SPAN class="comment token">#Get a count of total parcels</SPAN>
<SPAN class="keyword token">for</SPAN> row <SPAN class="keyword token">in</SPAN> cursor<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">if</SPAN> row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">!=</SPAN> <SPAN class="string token">'Invalid'</SPAN><SPAN class="punctuation token">:</SPAN>
insCursor<SPAN class="punctuation token">.</SPAN>insertRow<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN>row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN>row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
totalArea <SPAN class="operator token">+=</SPAN> row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN>
totalParcels <SPAN class="operator token">+=</SPAN> <SPAN class="number token">1</SPAN>
<SPAN class="comment token">#If the block is of a 'Residential' USE_CATEGORY type then add that value into the Residential DI calculation variable</SPAN>
<SPAN class="keyword token">if</SPAN> row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="keyword token">in</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Residential - Low Density'</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">'Residential - Medium Density'</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">'Residential - High Density'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
totalResArea <SPAN class="operator token">+=</SPAN> row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN>
totalResParcels <SPAN class="operator token">+=</SPAN> <SPAN class="number token">1</SPAN>
<SPAN class="comment token">#use summarystatistics against tableSelRecs to get totals per USE_CATEGORY and write results to tableSumRecs</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>Statistics_analysis<SPAN class="punctuation token">(</SPAN>r<SPAN class="string token">'in_memory\tableSelRecs'</SPAN><SPAN class="punctuation token">,</SPAN> r<SPAN class="string token">'in_memory\tableSumRecs'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="string token">"SHAPE_Area"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"SUM"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"USE_CATEGORY"</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">with</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>SearchCursor<SPAN class="punctuation token">(</SPAN>r<SPAN class="string token">'in_memory\tableSumRecs'</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="string token">'USE_CATEGORY'</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">'SUM_SHAPE_Area'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">as</SPAN> selCur<SPAN class="punctuation token">:</SPAN>
<SPAN class="comment token">#list to store calculation for each USE_CATEGORY value used in DI calculation</SPAN>
interimValue <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="comment token">#list to store calculation for each USE_CATEGORY value used in RDI calculation</SPAN>
interimResValue <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">for</SPAN> sRow <SPAN class="keyword token">in</SPAN> selCur<SPAN class="punctuation token">:</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'USE_CATEGORY: {}; AREA: {}'</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>sRow<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN>sRow<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#divide the USE_CATEGORY area by the total community area then square that number & append it to the list</SPAN>
interimValue<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN>np<SPAN class="punctuation token">.</SPAN>square<SPAN class="punctuation token">(</SPAN>sRow<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="operator token">/</SPAN>totalArea<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> sRow<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="keyword token">in</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Residential - Low Density'</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">'Residential - Medium Density'</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">'Residential - High Density'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
interimResValue<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN>np<SPAN class="punctuation token">.</SPAN>square<SPAN class="punctuation token">(</SPAN>sRow<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="operator token">/</SPAN>totalResArea<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#sum the values in the list then subtract that value from 1 to get the DI for the selected blocks</SPAN>
DI <SPAN class="operator token">=</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="operator token">-</SPAN> sum<SPAN class="punctuation token">(</SPAN>interimValue<SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#sum the values in the list then subtract that value from 1 to get the RDI for the selected blocks</SPAN>
RDI <SPAN class="operator token">=</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="operator token">-</SPAN> sum<SPAN class="punctuation token">(</SPAN>interimResValue<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Diversity Index: '</SPAN> <SPAN class="operator token">+</SPAN> str<SPAN class="punctuation token">(</SPAN>DI<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Residential Diversity Index: '</SPAN> <SPAN class="operator token">+</SPAN> str<SPAN class="punctuation token">(</SPAN>RDI<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Total Blocks Selected: '</SPAN> <SPAN class="operator token">+</SPAN> str<SPAN class="punctuation token">(</SPAN>totalParcels<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Total Blocks Area: '</SPAN> <SPAN class="operator token">+</SPAN> str<SPAN class="punctuation token">(</SPAN>totalArea<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Total Res Blocks Selected: '</SPAN> <SPAN class="operator token">+</SPAN> str<SPAN class="punctuation token">(</SPAN>totalResParcels<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Total Res Blocks Area: '</SPAN> <SPAN class="operator token">+</SPAN> str<SPAN class="punctuation token">(</SPAN>totalResArea<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>AddMessage<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'NOTE: Any blocks with a use category of Invalid are not included in any calculations.'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#Delete in memory tables</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>Delete_management<SPAN class="punctuation token">(</SPAN>r<SPAN class="string token">'in_memory\tableSelRecs'</SPAN><SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>Delete_management<SPAN class="punctuation token">(</SPAN>r<SPAN class="string token">'in_memory\tableSumRecs'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">except</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>ExecuteError<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN>arcpy<SPAN class="punctuation token">.</SPAN>GetMessages<SPAN class="punctuation token">(</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>