Mengkompilasi skrip Python (ke .exe) yang menggunakan ArcGIS Geoprocessing Tools?

12

Saya telah mengkode dengan Python selama beberapa bulan sekarang dan telah mengembangkan beberapa skrip yang cukup kompleks untuk tugas-tugas geoprosesing. Yang sedang berkata, saya masih belajar banyak karena saya berasal dari latar belakang SQL / VBA / VBScript.

Saya tahu bahwa kode yang dikompilasi biasanya berjalan lebih cepat daripada kode yang harus diproses oleh penerjemah bahasa, jadi saya tertarik pada kemungkinan mengkompilasi skrip Python geoprosesing ke file .EXE untuk bekerja dengan data besar.

Apakah ini mungkin? Jika ya, apa cara terbaik untuk mengkompilasi skrip Python (.py) yang mengimpor modul arcgisscripting atau arcpy?

Saya menghabiskan beberapa menit mencoba menemukan apa yang ingin saya lakukan dan pencarian mengembalikan artikel ini antara lain: http://www.ehow.com/how_2091641_compile-python-code.html

Kompiler tampaknya berfungsi, tetapi setelah mengeksekusi file .EXE yang dihasilkan, ia memberikan kesalahan samar mengatakan beberapa file tidak tersedia.

Skrip Python menjalankan apa yang tampaknya cukup baik dari baris perintah, tapi saya bertanya-tanya apakah saya bisa melihat sedikit perbaikan jika saya dapat mengkompilasi file .py. Sekali lagi, saya sedang bekerja dengan beberapa dataset besar yang membutuhkan waktu +20 jam untuk diproses (menggambarkan daerah aliran sungai dari lokasi sampel kualitas air masukan). Saya akan mengambil apa saja yang bisa saya lakukan untuk perbaikan.

Script berjalan 10% lebih cepat di luar ArcGIS dari baris perintah menggunakan set uji situs dibandingkan mengatur script sebagai alat skrip di kotak peralatan baru di ArcCatalog. Saya telah menjalankan skrip dari baris perintah tanpa ArcGIS terbuka pada mesin khusus.

Jadi, apakah mungkin untuk mengkompilasi skrip Python yang mengimpor modul arcgisscripting dan yang memanggil alat ArcToolBox?

EDIT

Terima kasih atas masukannya, ini sangat membantu saya. Script ini sebagian besar merupakan cara untuk mengoordinasikan sejumlah alat ArcGIS dan menghasilkan dalam format / lokasi yang diinginkan / dengan atribusi yang sesuai. Saya sudah memangkas beberapa lemak yang saya pikir dengan menulis ke folder awal bukannya ke awal geodatabase pribadi untuk beberapa file raster sementara sehingga mereka dapat disimpan dalam format ESRI GRID vs. format IMG. Saya akan memeriksa saran profiler sekalipun.

Ada beberapa di kantor saya yang mempertanyakan Python mengatakan "bahwa kode yang dikompilasi jauh lebih cepat daripada kode yang berjalan melalui penerjemah" terutama dibandingkan dengan, katakanlah, program Visual Basic yang dikompilasi atau program VB.NET, tetapi itu adalah poin yang baik bahwa alat akan memakan waktu baik cara. Dan, sepertinya dengan mesin komputasi masa kini bahwa kode yang ditafsirkan mungkin tidak lebih lambat dari kode yang dikompilasi untuk menjamin bekerja lebih keras.

EDIT - pembaruan tentang pengoptimalan program dengan format raster.

Ingin menindaklanjuti "optimasi" saya dari program Python ini, dan saya dapat mencukur 2 jam waktu pemrosesan dengan menulis raster sementara ke format GRID daripada ke geodatabase pribadi. Tidak hanya itu, ada pengurangan signifikan dalam konsumsi ruang disk ukuran data. Jangka asli saya menulis semua raster (dan mereka hanya fitur titik dikonversi ke raster, dan kemudian raster DAS) menghasilkan 37,1 GB data hanya untuk file-file itu. Menulis dua output data terakhir ke folder dalam format GRID dikurangi menjadi 667 MB data.

Saya ingin tahu bagaimana file GDB akan menangani data ini meskipun terutama dalam ukuran data. Tetapi, mengurangi waktu pemrosesan saya dari 9,5 jam menjadi 7,5 jam tentu cukup untuk mengadvokasi untuk berurusan dengan raster di luar geodatabases dalam format GRID.

turkishgold
sumber
ArcGIS Server Blog pagi ini sangat tepat waktu. Sterling @ esri melakukan pekerjaan yang baik untuk menguraikan mengapa dan kapan [di sini.] [1] [1]: blogs.esri.com/Dev/blogs/arcgisserver/archive/2011/04/12/…
Brad Nesom

Jawaban:

15

Pertanyaan pertama: berapa banyak yang Anda lakukan dengan Python? Apakah Anda hanya memanggil alat Geoprocessing atau Anda melakukan sejumlah besar analisis numerik dengan Python? Jika yang pertama, kemacetan kemungkinan tinggal di alat dan menggunakan kode asli dalam skrip Anda tidak akan membeli Anda sebanyak beberapa solusi cerdas lainnya. Jika yang terakhir, maka Anda mungkin ingin menemukan apa yang lambat dan membuatnya lebih cepat dengan algoritma yang lebih baik, atau mungkin numpy, atau opsi lain seperti yang dibahas di bawah ini.

py2exe sebenarnya tidak mengkompilasi kode Anda ke x86 / x64 asli, itu hanya menyediakan executable yang menanamkan skrip Anda sebagai bytecode dan menyediakan sebagian besar cara portabel untuk mendistribusikannya kepada pengguna tanpa Python pada sistem mereka. Gagal ketika mencoba untuk bundel arcgisscripting, itulah sebabnya itu tidak berhasil. Sebenarnya menjalankan py2exe tetap tidak akan melakukan apapun dengan performa yang baik.

Saya sangat menyarankan Anda pertama kali menggunakan profiler untuk mengidentifikasi bit yang lambat dan mengoptimalkan dari sana. Ada satu set yang sangat bagus untuk Python , gunakan cProfile dalam jangka panjang untuk menemukan tempat-tempat potensial untuk membuatnya lebih cepat. Dari sana Anda dapat mengoptimalkan bagian jauh ke kustom C atau mungkin bereksperimen dengan bagian-bagian kecil sebagai modul Cython .pyx.

Anda dapat melihat ke dalam Cython untuk kemungkinan membangun seluruh skrip Python sebagai modul ekstensi kode asli, tetapi Psyco juga dapat memberi Anda peningkatan kinerja dengan penghalang yang lebih rendah untuk masuk.

Jason Scheirer
sumber
4

Berapa lama delineasi batas air diperlukan jika dijalankan dari alat standar di ArcToolbox dibandingkan dengan versi skrip? Jika waktunya sama, maka saya curiga tidak akan ada perbaikan. Anda mungkin ingin mempertimbangkan untuk menjalankan proses panjang di latar belakang di luar ArcMap.


sumber
Saya mengklarifikasi pertanyaan awal saya, dan saya berharap masih mendapat jawaban ya / tidak yang meyakinkan apakah mungkin untuk mengkompilasi kode seperti itu karena jawaban ini tidak menjawab pertanyaan saya.
turkishgold
2
@turkish Ini mungkin tidak menjawab pertanyaan Anda secara langsung tetapi itu adalah saran yang bagus. Kemungkinannya bagus, proses Anda menghabiskan seluruh waktunya dalam penggambaran, jadi tidak ada jumlah penyesuaian kode yang akan sangat membantu. Namun, mempertimbangkan kembali algoritme dapat membuat perbedaan besar. Jadi salah satu hal pertama yang ingin Anda lakukan adalah profil eksekusi saat ini untuk melihat apakah Anda membuang-buang waktu dengan pendekatan kompilasi ini.
whuber
1
Saya setuju dengan @Dan dan @whuber. Saya pikir melakukan analisis yang lebih dalam (yaitu benchmarking dan profiling) akan menghasilkan wawasan yang jauh lebih baik untuk peningkatan kinerja daripada hanya pendekatan kompilasi segalanya yang kasar.
Jason Scheirer
4

Jangan gunakan geodatabase pribadi tanpa alasan yang jelas. Dalam pengalaman kami, mereka secara konsisten jauh lebih lambat daripada semua bentuk penyimpanan data lainnya ( ref ). Meskipun saya telah membaca satu laporan di sini di GIS.se yang melihat pribadi lebih cepat daripada file gdb.

Ketika alur kerja terdiri dari banyak iterasi kecil, panggilan untuk membuat geoprosesor dan memeriksa lisensi seringkali merupakan bagian paling mahal dari penggunaan python. Jadi melakukan sebanyak yang Anda bisa di depan atau di belakang gp = ...(atau import arcpydi v10) adalah salah satu teknik yang saya gunakan banyak.

Berkenaan dengan kompilasi, kutipan ini mengatakan yang terbaik:

Perlu dicatat bahwa saat menjalankan skrip [python] yang dikompilasi memiliki waktu startup yang lebih cepat (karena tidak perlu dikompilasi), skrip tersebut tidak berjalan lebih cepat.

Mark Cederholm memiliki presentasi tentang penggunaan ArcObjects dalam Python dengan beberapa statistik pada operasi shapecopy (slide # 4). Python tidak adil, berjalan pada 32% dari apa yang dapat dicapai dengan C ++ (VBA adalah 92%, VB & C # pada 48%). Jangan berlari dan menjerit terlalu cepat, banyak alat geoproses adalah skrip python (cari c: \ program file \ arcgis \ untuk '* .py').

Seperti yang banyak dikatakan di tempat lain, dengan python waktu yang dihabiskan untuk mencoba mengoptimalkan kinerja dengan menyusun atau menulis fungsi inti C atau C ++ sering mengerdilkan setiap keuntungan kinerja aktual (mungkin) yang dibuat pada saat runtime. Banyak yang mengatakan manfaat utama Python adalah mengoptimalkan dan meningkatkan waktu pengembang ; perhatian manusia jauh lebih berharga dan mahal daripada waktu pemrosesan mesin.

matt wilkie
sumber
1
Ya dalam semua hal. Untuk uang saya, penggunaan optimal waktu pengembang adalah untuk prototipe * dengan Python, benchmark, drop down ke C / C ++ untuk mengoptimalkan kemacetan. * Saya katakan prototipe, tetapi saya tahu 95% dari waktu bahwa 'prototipe' akan membuatnya menjadi produksi.
Jason Scheirer
Komentar luar biasa dan terima kasih atas tautan di ArcObjects dengan Python. Saya pikir menulis ke GDB memiliki manfaat dari perspektif manajemen data vs. shapefile (pembatasan tabel atribut di kelas shapefile vs. fitur, representasi geometri, praktik manajemen data keseluruhan, dll.) Serta hal-hal yang dapat Anda lakukan dengan lebih mudah dan lebih bersih di lingkungan Access vs. berurusan dengan file DBF. Jadi, pada dasarnya pertukaran biaya-manfaat dengan apa yang Anda lakukan dan apa yang harus Anda lakukan dengan data output. Jalan tengah raster di luar GDB dan segala sesuatu di GDB tampaknya berfungsi.
turkishgold
1

Anda tidak dapat mengkompilasi kode python ke kode mesin. Saat dijalankan pertama kali, kompilasi ke 'bytecode', bahasa perantara (yang membuat file pyc)

py2exe membungkus file dll yang diperlukan oleh interpreter dan semua file python yang diperlukan / file eksternal menjadi file executable. Itu tidak dikompilasi - runtime seharusnya tidak jauh berbeda.

Dimungkinkan untuk membuat kode Python berjalan sangat cepat, menggunakan kombinasi teknik yang berbeda.

Hal pertama yang harus Anda lakukan adalah membuat profil kode Anda untuk menemukan kemacetan. Setelah ditemukan, saya biasanya menggunakan proses ini:

  • Hilangkan loop 'for' dengan menggunakan array numpy atau fungsi map (). Ini pada dasarnya mendorong loop ke C.
  • Selidiki implementasi algoritma yang lebih baik (jenis ini berjalan bersamaan dengan yang di atas). Hal-hal seperti mengurangi jumlah operasi I / O, memastikan data diakses / disimpan dalam blok yang berdekatan.
  • 'Trik' juru bahasa seperti menghindari pencarian mahal di dalam loop, menghindari 'jika' memblokir dalam loop (gunakan 'coba' sebagai gantinya)
  • Profil lagi
  • Jika masih terlalu lambat, lihat mendorong bagian-bagian penting ke C menggunakan Cython (atau menulis langsung dalam C, membuat dll, dan menggunakan ctypes untuk menyebutnya)
  • Profil lagi
  • Jika masih terlalu lambat, lihat komputasi paralel atau GPU (pustaka multiprosesing, pyCUDA, ParallelPython, dll.)
James
sumber
0

Jika Anda mengimpor skrip python dari lokasi lain, ia menghasilkan file .pyc. Jadi, satu cara mudah untuk menguji apakah kompilasi membuat perbedaan adalah mengubah skrip Anda menjadi fungsi (misalnya main ()). Jika Anda menyimpan skrip itu example.pysaat membuat file lain dengan baris berikut:

import example
example.main() # call your script(s)

Jika Anda berlari dari skrip, dan berjalan saat diimpor, mungkin Anda bisa melihat perbedaannya. Ini adalah cara berteknologi rendah untuk melakukannya.

djq
sumber