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.
Jawaban:
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.
sumber
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
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 = ...
(atauimport arcpy
di v10) adalah salah satu teknik yang saya gunakan banyak.Berkenaan dengan kompilasi, kutipan ini mengatakan yang terbaik:
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.
sumber
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:
sumber
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.py
saat membuat file lain dengan baris berikut:Jika Anda berlari dari skrip, dan berjalan saat diimpor, mungkin Anda bisa melihat perbedaannya. Ini adalah cara berteknologi rendah untuk melakukannya.
sumber