डेटा एक्सेस मॉड्यूल को आर्कजीआईएस संस्करण 10.1 के साथ पेश किया गया था। ESRI डेटा एक्सेस मॉड्यूल का वर्णन इस प्रकार है ( स्रोत ):
डेटा एक्सेस मॉड्यूल, arcpy.da, डेटा के साथ काम करने के लिए पायथन मॉड्यूल है। यह एडिट सेशन, एडिट ऑपरेशन, बेहतर कर्सर सपोर्ट (तेज प्रदर्शन सहित) को नियंत्रित करने, टेबल और फीचर क्लासेस को न्यूमपी एरेज़ से, और वर्जनिंग, रेप्लिका, डोमेन के लिए सपोर्ट, और वर्कफ़्लोज़ को सब-सपोर्ट देता है।
हालाँकि, कर्सर के प्रदर्शन में पिछली पीढ़ी के कर्सरों के स्तर में इतना सुधार क्यों है, इस बारे में बहुत कम जानकारी है।
संलग्न आंकड़ा नई da
पद्धति UpdateCursor बनाम पुरानी UpdateCursor विधि पर एक बेंचमार्क परीक्षण के परिणाम दिखाता है । अनिवार्य रूप से, स्क्रिप्ट निम्नलिखित वर्कफ़्लो करती है:
- यादृच्छिक अंक बनाएं (10, 100, 1000, 10000, 100000)
- एक सामान्य वितरण से बेतरतीब ढंग से नमूना और एक कर्सर के साथ यादृच्छिक अंक विशेषता तालिका में एक नए स्तंभ के लिए मूल्य जोड़ें
- नए और पुराने दोनों UpdateCursor तरीकों के लिए प्रत्येक यादृच्छिक बिंदु परिदृश्य के 5 पुनरावृत्तियों को चलाएं और सूचियों का औसत मान लिखें
- परिणामों को प्लॉट करें
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()