Mô-đun truy cập dữ liệu được giới thiệu với ArcGIS phiên bản 10.1. ESRI mô tả mô-đun truy cập dữ liệu như sau ( nguồn ):
Mô-đun truy cập dữ liệu, arcpy.da, là mô-đun Python để làm việc với dữ liệu. Nó cho phép kiểm soát phiên chỉnh sửa, thao tác chỉnh sửa, hỗ trợ con trỏ được cải thiện (bao gồm hiệu suất nhanh hơn), các chức năng để chuyển đổi bảng và các lớp tính năng sang và từ mảng NumPy và hỗ trợ cho quy trình làm việc phiên bản, bản sao, tên miền và kiểu con.
Tuy nhiên, có rất ít thông tin liên quan đến lý do tại sao hiệu suất con trỏ được cải thiện so với thế hệ con trỏ trước đó.
Hình đính kèm cho thấy kết quả của một bài kiểm tra điểm chuẩn trên da
phương thức UpdateCoder mới so với phương thức UpdateCoder cũ. Về cơ bản, tập lệnh thực hiện quy trình công việc sau:
- Tạo điểm ngẫu nhiên (10, 100, 1000, 10000, 100000)
- Lấy mẫu ngẫu nhiên từ một phân phối bình thường và thêm giá trị vào một cột mới trong bảng thuộc tính điểm ngẫu nhiên bằng một con trỏ
- Chạy 5 lần lặp của mỗi kịch bản điểm ngẫu nhiên cho cả phương thức UpdateCoder mới và cũ và ghi giá trị trung bình vào danh sách
- Vẽ kết quả
Điều gì đang xảy ra đằng sau hậu trường với da
con trỏ cập nhật để cải thiện hiệu suất con trỏ đến mức độ được hiển thị trong hình?
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()