El módulo de acceso a datos se introdujo con ArcGIS versión 10.1. 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, la compatibilidad mejorada con el cursor (incluido un rendimiento más rápido), las funciones para convertir tablas y clases de entidad hacia y desde matrices NumPy, y la compatibilidad con versiones, réplicas, dominios y flujos de trabajo de subtipos.
Sin embargo, hay muy poca información sobre por qué 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 versus el antiguo método UpdateCursor. Esencialmente, el script realiza el siguiente flujo de trabajo:
- Crear puntos aleatorios (10, 100, 1000, 10000, 100000)
- Muestra aleatoriamente de una distribución normal y agrega valor a una nueva columna en la tabla de atributos de puntos aleatorios con un cursor
- Ejecute 5 iteraciones de cada escenario de punto aleatorio para los métodos UpdateCursor nuevos y antiguos y escriba el valor medio en las listas
- Graficar los resultados
¿Qué sucede detrás de escena con el da
cursor de actualización para mejorar el rendimiento del cursor en el grado que se muestra 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()