Найшвидший спосіб підрахувати кількість функцій у класі функцій?


35

Завдяки впровадженню модуля доступу до даних в arcpy (30-кратні швидкі курсори пошуку), я хочу знати, чи швидше підраховувати функції, що відповідають критеріям sql, ніж традиційна методологія MakeTableView + GetCount?


12
Як нерозумно, що кількість функцій не є лише властивістю arcpy. Опишіть об’єкт
Grant Humphries

Це було досить просто за допомогою ogrinfo із деяким OGR SQL . Набір даних має щось на зразок 170000 записів, і цей пошук підстановок у невкладеному VARCHARполі повернувся лише за кілька секунд. ogrinfo "C:\xGIS\Vector\parcels\parcels_20140829_pmerc.ovf -sql "SELECT count(*) FROM parcels_20140829_pmerc WHERE tms like 'R39200-02-%'"
elrobis

Відповіді:


2

Я випробував рішення з відповіді вище, і в моїх реальних даних різниця незначна. На відміну від результатів іншої відповіді, мої часи для arcpy.MakeTableView_management і arcpy.da.SearchCursor в ArcMap однакові.

Я перевірив варіанти з запитом і без нього, будь ласка, дивіться код для версії запиту та кінцеві результати вимірювання нижче:

@staticmethod
def query_features(feature_class, query):

    # Method 1
    time.sleep(5)  # Let the cpu/ram calm before proceeding!
    start_time = time.clock()
    count = len(list(i for i in arcpy.da.SearchCursor(feature_class, ["OBJECTID"], query)))
    end_time = time.clock()
    arcpy.AddMessage("Method 1 finished in {} seconds".format((end_time - start_time)))
    arcpy.AddMessage("{} features".format(count))

    # Method 2
    time.sleep(5)  # Let the cpu/ram calm before proceeding!
    start_time = time.clock()
    arcpy.MakeTableView_management(feature_class, "myTableView", query)
    count = int(arcpy.GetCount_management("myTableView").getOutput(0))

    end_time = time.clock()
    arcpy.AddMessage("Method 2 in {} seconds".format((end_time - start_time)))
    arcpy.AddMessage("{} features".format(count))

Результати нижче:

    No query:
    Method 1 finished in 5.3616442 seconds
    804140 features
    Method 2 in 4.2843138 seconds
    804140 features

    Many results query:
    Method 1 finished in 12.7124766 seconds
    518852 features
    Method 2 in 12.1396602 seconds
    518852 features

    Few results query:
    Method 1 finished in 11.1421476 seconds
    8 features
    Method 2 in 11.2232503 seconds
    8 features

Що ж, пройшло вже 7 років з моменту відповіді, і я сподіваюся, що вони вдосконалили свій SDK !!! =) дякую, що ви тестували його сам Miro.
Майкл Маркієта

47

Я використовую приклад з 1 мільйоном випадково генерованих точок всередині файлової бази даних. Тут додається .

Ось декілька кодів для початку роботи:

import time
import arcpy

arcpy.env.workspace = "C:\CountTest.gdb"

time.sleep(5) # Let the cpu/ram calm before proceeding!

"""Method 1"""
StartTime = time.clock()
with arcpy.da.SearchCursor("RandomPoints", ["OBJECTID"]) as cursor:
    rows = {row[0] for row in cursor}

count = 0
for row in rows:
    count += 1

EndTime = time.clock()
print "Finished in %s seconds" % (EndTime - StartTime)
print "%s features" % count

time.sleep(5) # Let the cpu/ram calm before proceeding!

"""Method 2"""
StartTime2 = time.clock()
arcpy.MakeTableView_management("RandomPoints", "myTableView")
count = int(arcpy.GetCount_management("myTableView").getOutput(0))

EndTime2 = time.clock()
print "Finished in %s seconds" % (EndTime2 - StartTime2)
print "%s features" % count

І деякі початкові результати:

>>> 
Finished in 6.75540050237 seconds
1000000 features
Finished in 0.801474780332 seconds
1000000 features
>>> =============================== RESTART ===============================
>>> 
Finished in 6.56968596918 seconds
1000000 features
Finished in 0.812731769756 seconds
1000000 features
>>> =============================== RESTART ===============================
>>> 
Finished in 6.58207512487 seconds
1000000 features
Finished in 0.841122157314 seconds
1000000 features

Уявіть більші, складніші набори даних. SearchCursor буде нескінченно повзати.

Я зовсім не задоволений результатами, однак модуль DataAccess широко використовується в нашому колі розвитку ГІС. Я хочу відновити деякі наші визначення функцій за допомогою цього модуля, оскільки він є більш гнучким, ніж методологія MakeTableView + GetCount.


Приємний загін. Для повноти я хотів би додати те, що IMO має бути найшвидшим, але насправді це найбільш повільний метод (у 10 разів повільніше). arcpy.Statistics_analysis("RandomPoints", r"in_memory\count", [["OBJECTID", "COUNT"]]) cursor = arcpy.da.SearchCursor(r"in_memory\count", ["COUNT_OBJECTID"]) row = cursor.next() del cursor count = row[0]
Беренд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.