Самый быстрый способ подсчитать количество объектов в классе объектов?

36

С появлением модуля Data Access в arcpy (в 30 раз быстрее курсоров поиска) я хочу знать, быстрее ли подсчитывает объекты, соответствующие критериям sql, чем традиционная методология MakeTableView + GetCount?

Майкл Маркиета
источник
12
Насколько глупо, что количество объектов не просто свойство arcpy. Опишите объект
Грант Хамфрис,
Это было довольно легко с 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

Ответы:

3

Я проверил решение из ответа выше, и на моих реальных данных разница незначительна. В отличие от результатов другого ответа, мои времена для 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
Miro
источник
Ну, прошло около 7 лет с тех пор, как на вопрос был дан ответ, поэтому я надеюсь, что они внесли улучшения в свой SDK !!! =) спасибо, что протестировал это сам Миро.
Майкл Маркиета
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]
Беренд