Das Datenzugriffsmodul wurde mit ArcGIS Version 10.1 eingeführt. ESRI beschreibt das Datenzugriffsmodul wie folgt ( Quelle ):
Das Datenzugriffsmodul arcpy.da ist ein Python-Modul zum Arbeiten mit Daten. Es ermöglicht die Steuerung der Editiersitzung, des Editiervorgangs, eine verbesserte Cursorunterstützung (einschließlich einer schnelleren Leistung), Funktionen zum Konvertieren von Tabellen und Feature-Classes in und aus NumPy-Arrays sowie die Unterstützung von Versionierungs-, Replikations-, Domänen- und Subtyp-Workflows.
Es gibt jedoch nur sehr wenige Informationen darüber, warum die Cursorleistung gegenüber der vorherigen Cursorgeneration so verbessert wurde.
Die beigefügte Abbildung zeigt die Ergebnisse eines Benchmark-Tests für die neue da
Methode UpdateCursor im Vergleich zur alten UpdateCursor-Methode. Im Wesentlichen führt das Skript den folgenden Workflow aus:
- Erstelle zufällige Punkte (10, 100, 1000, 10000, 100000)
- Wählen Sie eine zufällige Stichprobe aus einer Normalverteilung und fügen Sie mit einem Cursor einen Wert zu einer neuen Spalte in der Attributtabelle für zufällige Punkte hinzu
- Führen Sie 5 Iterationen jedes Zufallspunktszenarios für die neue und die alte UpdateCursor-Methode aus und schreiben Sie den Mittelwert in Listen
- Zeichnen Sie die Ergebnisse
Was passiert hinter den Kulissen mit dem da
Aktualisierungscursor, um die Cursorleistung in dem in der Abbildung gezeigten Maße zu verbessern?
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()