El módulo de acceso a datos se introdujo con la versión 10.1 de ArcGIS. ESRI describe el módulo de acceso a datos de la siguiente manera ( fuente ):
El módulo de acceso a datos, arcpy.da, es un módulo de Python para trabajar con datos. Permite el control de la sesión de edición, la operación de edición, el soporte mejorado del soporte del cursor (incluyendo un rendimiento más rápido), funciones para convertir tablas y clases de características a y desde matrices NumPy, y soporte para flujos de trabajo de versiones, réplicas, dominios y subtipos.
Sin embargo, hay muy poca información sobre la razón por la que el rendimiento del cursor ha mejorado tanto con respecto a la generación anterior de cursores.
La figura adjunta muestra los resultados de una prueba de referencia en el nuevo da
método UpdateCursor frente al antiguo método UpdateCursor. Esencialmente, el script realiza el siguiente flujo de trabajo:
- Crear puntos aleatorios (10, 100, 1000, 10000, 100000)
- Tomar una muestra aleatoria de una distribución normal y añadir valor a un nuevo columna en la tabla de atributos de puntos aleatorios con un cursor
- Ejecuta 5 iteraciones de cada escenario de puntos aleatorios para los métodos UpdateCursor nuevo y antiguo y escribe el valor medio en las listas
- Trazar los resultados
¿Qué está pasando entre bastidores con el da
actualizar el cursor para mejorar el rendimiento del cursor en el grado mostrado en la figura?
import arcpy, os, numpy, time
arcpy.env.overwriteOutput = True
outws = r'C:\temp'
fc = os.path.join(outws, 'randomPoints.shp')
iterations = [10, 100, 1000, 10000, 100000]
old = []
new = []
meanOld = []
meanNew = []
for x in iterations:
arcpy.CreateRandomPoints_management(outws, 'randomPoints', '', '', x)
arcpy.AddField_management(fc, 'randFloat', 'FLOAT')
for y in range(5):
# Old method ArcGIS 10.0 and earlier
start = time.clock()
rows = arcpy.UpdateCursor(fc)
for row in rows:
# generate random float from normal distribution
s = float(numpy.random.normal(100, 10, 1))
row.randFloat = s
rows.updateRow(row)
del row, rows
end = time.clock()
total = end - start
old.append(total)
del start, end, total
# New method 10.1 and later
start = time.clock()
with arcpy.da.UpdateCursor(fc, ['randFloat']) as cursor:
for row in cursor:
# generate random float from normal distribution
s = float(numpy.random.normal(100, 10, 1))
row[0] = s
cursor.updateRow(row)
end = time.clock()
total = end - start
new.append(total)
del start, end, total
meanOld.append(round(numpy.mean(old),4))
meanNew.append(round(numpy.mean(new),4))
#######################
# plot the results
import matplotlib.pyplot as plt
plt.plot(iterations, meanNew, label = 'New (da)')
plt.plot(iterations, meanOld, label = 'Old')
plt.title('arcpy.da.UpdateCursor -vs- arcpy.UpdateCursor')
plt.xlabel('Random Points')
plt.ylabel('Time (minutes)')
plt.legend(loc = 2)
plt.show()