Это довольно общий вопрос. Мне просто интересно, какие советы и хитрости использовали ГИС-программисты для ускорения скриптов arcpy, которые вы импортируете в набор инструментов и запускаете.
Я каждый день работаю над написанием небольших сценариев, чтобы помочь не-ГИС-пользователям в моем офисе обрабатывать ГИС-данные. Я обнаружил, что обработка ArcGIS 10.0 в целом медленнее, чем 9.3.1, и иногда она становится еще медленнее при запуске скрипта Python.
Я собираюсь перечислить конкретный пример сценария, выполнение которого занимает более 24 часов. Это цикл, который табулирует область растра в буфере для каждой фигуры в буфере. Буфер имеет около 7000 фигур. Я не верю, что это должно длиться так долго.
while x <= layerRecords:
arcpy.SetProgressorLabel("Tabulating Row: " + str(x) + " of " + str(ELClayerRecords))
arcpy.SelectLayerByAttribute_management(Buff,"NEW_SELECTION", "Recno = " + str(x)) # Selecting the record
TabulateArea(Buff, "Recno", MatGRID, "VALUE", ScratchWS + "/tab" + str(z) +".dbf", nMatGRIDc) # Tabulate the area of the single row
arcpy.AddMessage (" - Row: " + str(x) + " completed")
x = x + 1
z = z + 1
Прежде чем кто-либо скажет это, я запустил табулирование области для всего буфера, но он выдает ошибки, если выполняется более 1 записи. Это некорректный инструмент, но я должен его использовать.
В любом случае, если у кого-то есть идеи, как оптимизировать или ускорить этот скрипт, это было бы очень ценно. В противном случае, есть ли у вас какие-либо приемы ускорения работы с Python при использовании в ArcGIS?
источник
Общие методы оптимизации Python могут сэкономить вам значительное количество времени.
Одним из действительно хороших методов для определения того, где находятся задержки в вашем скрипте, является использование встроенного модуля cProfile:
Тестирование с использованием небольшой выборки данных позволит вам определить, какие вызовы функций занимают больше всего времени.
Общие указатели для более быстрого кода на Python:
Что касается вашего скрипта, я не могу комментировать аспекты ArcPy, так как у меня не установлена Arc на этом компьютере, но вы можете попробовать использовать цикл for вместо цикла while, посмотрите, улучшит ли это что-нибудь. Также x = x + 1 можно записать как x + = 1:
источник
Убедитесь, что вы пишете на внутренний диск компьютера. Охват по сети, когда в этом нет необходимости, может реально замедлить обработку. Это может быть даже быстрее, чтобы скопировать данные в качестве первого шага в процессе, чтобы сохранить последующие операции чтения-записи как можно быстрее
Запуск скрипта полностью вне ArcMap может быть намного быстрее. Если карта не требуется во время обработки, не используйте ArcMap.
источник
Calculate Value
диалога) будет происходить быстрее, чем запуск этого скрипта из окна ArcPy в ArcMap. Это чисто анекдотическое наблюдение, хотя.Это может не ответить на ваш вопрос о запуске инструментов ArcPy внутри ArcMap, но когда мне нужно выполнить некоторую сложную обработку с помощью инструментов геообработки и Python, я склонен запускать ее вне системы ГИС с использованием IDE PyScripter . Я обнаружил, что он работает быстрее. Я также использовал RAMDISK для небольших временных наборов выходных данных (немного похоже на рабочее пространство in_memory )
Ну, они мои главные советы! :)
источник
Попробуйте закомментировать arcpy.SetProgressorLabel и посмотрите, насколько вы ускорились. Я обнаружил, что любой вывод на экран, вплоть до ошеломления DOS, резко замедляет время обработки. Если вам действительно нужно увидеть этот вывод, попробуйте показать его каждый N-й цикл.
источник
Убедитесь, что вы удалили все
import xxxx
строки, которые не используются.(т.е. если вы еще не используете математические функции
import Math
, это займет некоторое время после загрузки скрипта)Хотя это не окажет большого влияния на отдельные скрипты, которые запускаются (например, ваши), это повлияет на любые скрипты, которые запускаются часто и периодически.
источник
import Math
был плохим примером. Однако для загрузки некоторых из более крупных библиотек ArcPy требуется значительное количество времени.