Modul akses data diperkenalkan dengan ArcGIS versi 10.1. ESRI menjelaskan modul akses data sebagai berikut ( sumber ):
Modul akses data, arcpy.da, adalah modul Python untuk bekerja dengan data. Ini memungkinkan kontrol sesi edit, operasi edit, dukungan kursor yang ditingkatkan (termasuk kinerja yang lebih cepat), fungsi untuk mengkonversi tabel dan kelas fitur ke dan dari array NumPy, dan dukungan untuk versi, replika, domain, dan alur kerja subtipe.
Namun, ada sangat sedikit informasi mengenai mengapa kinerja kursor sangat ditingkatkan dari generasi kursor sebelumnya.
Gambar terlampir menunjukkan hasil uji patokan pada da
metode baru UpdateCursor versus metode UpdateCursor lama. Pada dasarnya, skrip melakukan alur kerja berikut:
- Buat poin acak (10, 100, 1000, 10000, 100000)
- Sampel secara acak dari distribusi normal dan tambahkan nilai ke kolom baru dalam tabel atribut poin acak dengan kursor
- Jalankan 5 iterasi dari setiap skenario titik acak untuk metode UpdateCursor baru dan lama dan tulis nilai rata-rata ke daftar
- Plot hasilnya
Apa yang terjadi di balik layar dengan da
kursor pembaruan untuk meningkatkan kinerja kursor ke tingkat yang ditunjukkan pada gambar?
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()