Модуль доступу до даних був представлений з ArcGIS версії 10.1. ESRI описує модуль доступу до даних наступним чином ( джерело ):
Модуль доступу до даних, arcpy.da, є модулем Python для роботи з даними. Це дозволяє контролювати сеанс редагування, операцію редагування, покращену підтримку курсору (включаючи більш високу продуктивність), функції для перетворення таблиць і класів функцій в масиви NumPy і з них, а також підтримку робочих процесів версій, реплік, доменів і підтипів.
Однак є дуже мало інформації щодо того, чому продуктивність курсора настільки поліпшена порівняно з попереднім поколінням курсорів.
На малюнку, що додається, показані результати тесту на орієнтир нового da
методу UpdateCursor порівняно зі старим методом UpdateCursor. По суті, сценарій виконує такий робочий процес:
- Створіть випадкові точки (10, 100, 1000, 10000, 100000)
- Випадково вибірки з звичайного розподілу і додайте значення до нового стовпця в таблиці атрибутів випадкових точок з курсором
- Виконайте 5 ітерацій кожного сценарію випадкових точок як для нових, так і для старих методів UpdateCursor та запишіть середнє значення у списки
- Позначте результати
Що відбувається за кадром з da
курсором оновлення, щоб покращити ефективність курсора до ступеня, показаної на рисунку?
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()