รวบรวมสคริปต์ Python (เป็น. exe) ที่ใช้เครื่องมือ ArcGIS Geoprocessing?


12

ฉันได้รับการเข้ารหัสกับ Python มาหลายเดือนแล้วและได้พัฒนาสคริปต์ที่ซับซ้อนพอสมควรสำหรับงานการประมวลผลทางภูมิศาสตร์เป็นหลัก ที่ถูกกล่าวว่าฉันยังคงเรียนรู้มากขณะที่ฉันมาจากพื้นหลัง SQL / VBA / VBScript

ฉันรู้ว่ารหัสที่คอมไพล์ทำงานได้เร็วกว่าโค้ดที่ต้องใช้ตัวแปลภาษาดังนั้นฉันจึงสนใจที่จะรวบรวมสคริปต์ Python สำหรับการประมวลผลทางภูมิศาสตร์กับไฟล์. EXE สำหรับการทำงานกับข้อมูลขนาดใหญ่

เป็นไปได้ไหม ถ้าเป็นวิธีที่ดีที่สุดในการรวบรวมสคริปต์ Python (.py) ที่นำเข้าโมดูล arcgisscripting หรือ arcpy คืออะไร

ฉันใช้เวลาสองสามนาทีเพื่อค้นหาสิ่งที่ฉันต้องการจะทำและการค้นหาส่งคืนบทความนี้ให้คนอื่น ๆ : http://www.ehow.com/how_2091641_compile-python-code.html

คอมไพเลอร์ดูเหมือนจะใช้งานได้ แต่เมื่อทำการประมวลผลไฟล์. EXE ที่เกิดขึ้นมันทำให้เกิดข้อผิดพลาดที่ซ่อนเร้นว่าบางไฟล์ไม่มี

สคริปต์ Python ทำงานในสิ่งที่ดูเหมือนจะดีพอสมควรจากบรรทัดคำสั่ง แต่ฉันสงสัยว่าฉันจะเห็นการปรับปรุงเล็กน้อยถ้าฉันสามารถรวบรวมไฟล์. py อีกครั้งฉันกำลังทำงานกับชุดข้อมูลขนาดใหญ่ที่ใช้เวลาในการประมวลผลประมาณ 20 ชั่วโมง (การแยกแหล่งต้นกำเนิดจากแหล่งตัวอย่างคุณภาพน้ำที่ป้อน) ฉันจะทำทุกอย่างที่จะทำให้ดีขึ้น

สคริปต์รันเร็วกว่า 10% นอก ArcGIS จากบรรทัดคำสั่งโดยใช้ชุดทดสอบของเว็บไซต์เทียบกับการตั้งค่าสคริปต์เป็นเครื่องมือสคริปต์ในกล่องเครื่องมือใหม่ใน ArcCatalog ฉันใช้งานสคริปต์จากบรรทัดคำสั่งโดยไม่มีอินสแตนซ์ใด ๆ ของ ArcGIS ที่เปิดอยู่บนเครื่องเฉพาะ

ดังนั้นจึงเป็นไปได้ที่จะรวบรวมสคริปต์ Python ที่นำเข้าโมดูล arcgisscripting และเรียกเครื่องมือ ArcToolBox หรือไม่?

แก้ไข

ขอบคุณสำหรับอินพุตสิ่งนี้มีประโยชน์สำหรับฉัน สคริปต์ส่วนใหญ่เป็นวิธีการประสานงานเครื่องมือ ArcGIS จำนวนหนึ่งและส่งออกในรูปแบบ / สถานที่ที่ต้องการ / พร้อมการระบุแหล่งที่มาที่เหมาะสม ฉันได้ตัดแต่งไขมันบางส่วนฉันคิดว่าโดยการเขียนไปยังโฟลเดอร์เริ่มต้นแทนการลบฐานข้อมูลส่วนบุคคลส่วนบุคคลสำหรับไฟล์แรสเตอร์ชั่วคราวบางไฟล์เพื่อให้สามารถจัดเก็บในรูปแบบ ESRI GRID เทียบกับรูปแบบ IMG ฉันจะตรวจสอบคำแนะนำของผู้สร้างโปรไฟล์ว่า

มีบางอย่างในสำนักงานของฉันที่คำถามของ Python ที่พูดว่า"รหัสที่รวบรวมนั้นเร็วกว่ารหัสที่ทำงานผ่านล่าม"ส่วนใหญ่เมื่อเปรียบเทียบกับการพูดโปรแกรม Visual Basic ที่คอมไพล์หรือโปรแกรม VB.NET ที่คอมไพล์แล้ว เครื่องมือจะต้องใช้เวลาอย่างใดอย่างหนึ่ง และดูเหมือนว่าในปัจจุบันคอมพิวเตอร์เครื่องที่ตีความรหัสอาจไม่ช้ากว่ารหัสที่คอมไพล์เพื่อรับประกันว่าจะได้รับไมล์พิเศษ

แก้ไข - อัปเดตเกี่ยวกับการเพิ่มประสิทธิภาพของโปรแกรมด้วยรูปแบบแรสเตอร์

ต้องการติดตาม "การเพิ่มประสิทธิภาพ" ของโปรแกรม Python ของฉันและฉันสามารถโกนเวลาการประมวลผล 2 ชั่วโมงโดยการเขียน rasters ระหว่างกาลเป็นรูปแบบ GRID แทนที่จะเป็นฐานข้อมูลส่วนบุคคลทางภูมิศาสตร์ ไม่เพียงเท่านั้นยังมีการลดการใช้พื้นที่ดิสก์ขนาดข้อมูลลงอย่างมาก การเริ่มต้นที่ฉันเขียน rasters ทั้งหมด (และพวกเขาเป็นเพียงคุณสมบัติจุดแปลงเป็น rasters แล้ว rasters ลุ่มน้ำ) ส่งผลให้ข้อมูล 37.1 GB สำหรับไฟล์เหล่านั้น การเขียนเอาต์พุตข้อมูลสองหลังไปยังโฟลเดอร์ในรูปแบบ GRID จะลดลงเป็น 667 MB ของข้อมูล

ฉันอยากรู้ว่า GDB จะจัดการกับข้อมูลเหล่านี้อย่างไรแม้ว่าขนาดของข้อมูลจะเป็นอย่างไร แต่การลดเวลาในการประมวลผลของฉันลงจาก 9.5 ชั่วโมงเหลือ 7.5 ชั่วโมงก็เพียงพอแล้วที่จะสนับสนุนการจัดการ rasters นอกฐานข้อมูลภูมิศาสตร์ในรูปแบบ GRID


เช้านี้บล็อกเซิร์ฟเวอร์ ArcGIS นั้นตรงเวลามาก Sterling @ esri ทำงานได้ดีในการสรุปว่าทำไมและเมื่อ [ที่นี่] [1] [1]: blogs.esri.com/Dev/blogs/arcgisserver/archive/2011/04/12/ …
แบรดเนสซัม

คำตอบ:


15

คำถามแรก: คุณทำอะไรกับ Python คุณเพิ่งจะเรียกเครื่องมือการประมวลผลเชิงภูมิศาสตร์หรือคุณกำลังทำการวิเคราะห์เชิงตัวเลขจำนวนมากใน Python หรือไม่? หากก่อนหน้านี้คอขวดมีแนวโน้มที่จะอาศัยอยู่ในเครื่องมือและการใช้รหัสเนทีฟในสคริปต์ของคุณจะไม่ซื้อคุณเท่า ๆ กับวิธีแก้ไขอื่น ๆ ที่ชาญฉลาด หากหลังคุณอาจต้องการค้นหาสิ่งที่ช้าและทำให้เร็วขึ้นด้วยอัลกอริทึมที่ดีขึ้นหรืออาจเป็นไปได้ว่ามีจำนวนมากหรือตัวเลือกอื่นตามที่อธิบายไว้ด้านล่าง

py2exe ไม่ได้คอมไพล์โค้ดของคุณเป็น native x86 / x64 เพียงแค่มีไฟล์ปฏิบัติการที่ฝังสคริปต์ของคุณเป็น bytecode และเป็นวิธีพกพาส่วนใหญ่ในการกระจายไปยังผู้ใช้ที่ไม่มี Python บนระบบของพวกเขา มันล้มเหลวเมื่อพยายามมัด arcgisscripting ซึ่งเป็นสาเหตุที่มันไม่ทำงาน จริงๆแล้วการทำให้ py2exe ยังทำงานอยู่จะไม่ทำสิ่งใดเลย

ฉันขอแนะนำอย่างยิ่งให้คุณใช้ผู้สร้างโปรไฟล์เพื่อระบุบิตช้าและปรับให้เหมาะสมจากที่นั่น มีชุดที่ดีมากในตัว Pythonใช้cProfileในระยะยาวเพื่อค้นหาสถานที่ที่มีศักยภาพเพื่อทำให้เร็วขึ้น จากตรงนั้นคุณสามารถเพิ่มประสิทธิภาพส่วนที่ไม่อยู่ใน C แบบกำหนดเองหรืออาจทำการทดลองด้วยส่วนเล็ก ๆ เป็นโมดูลCython .pyx

คุณสามารถดู Cython เพื่อสร้างสคริปต์ Python ทั้งหมดเป็นโมดูลส่วนขยายของรหัสเนทีฟ แต่Psycoอาจเพิ่มประสิทธิภาพให้คุณด้วยอุปสรรคที่ต่ำกว่าในการเข้า


4

การแบ่งพื้นที่ลุ่มน้ำใช้เวลานานเท่าใดหากเรียกใช้จากเครื่องมือมาตรฐานใน ArcToolbox เมื่อเทียบกับเวอร์ชันสคริปต์ หากเวลาใกล้เคียงกันฉันสงสัยว่าจะไม่มีการปรับปรุง คุณอาจต้องการพิจารณาดำเนินการกระบวนการที่ยาวนานในพื้นหลังด้านนอกของ ArcMap


ฉันชี้แจงคำถามเดิมของฉันและหวังว่าจะยังคงได้รับคำตอบว่าใช่ / ไม่ใช่ตอบเป็นไปได้หรือไม่ที่จะรวบรวมรหัสเช่นนี้เนื่องจากคำตอบนี้ไม่ได้ตอบคำถามของฉัน
turkishgold

2
@ turkish อาจไม่ตอบคำถามของคุณโดยตรง แต่เป็นคำแนะนำที่ยอดเยี่ยม โอกาสที่ดีที่กระบวนการของคุณจะใช้เวลาทั้งหมดในการวิเคราะห์ดังนั้นจำนวนของการปรับแต่งโค้ดจะช่วยให้เห็นคุณค่า อย่างไรก็ตามการพิจารณาขั้นตอนวิธีอาจทำให้เกิดความแตกต่างอย่างมาก ดังนั้นหนึ่งในสิ่งแรกที่คุณต้องการทำคือโปรไฟล์การดำเนินการปัจจุบันเพื่อดูว่าคุณกำลังเสียเวลากับวิธีการรวบรวมนี้หรือไม่
whuber

1
ฉันเห็นด้วยกับ @Dan และ @whuber ฉันคิดว่าการวิเคราะห์เชิงลึก (เช่นการเปรียบเทียบและการทำโปรไฟล์) จะให้ข้อมูลเชิงลึกที่ดีกว่าสำหรับการปรับปรุงประสิทธิภาพมากกว่าการรวบรวมทุกอย่างเข้าด้วยกัน
Jason Scheirer

4

อย่าใช้ฐานข้อมูลส่วนบุคคลโดยไม่มีเหตุผลที่ดี จากประสบการณ์ของเราพวกมันช้ากว่าการจัดเก็บข้อมูล esri ในรูปแบบอื่น ๆ ( อ้างอิง ) อย่างสม่ำเสมอ แม้ว่าฉันจะได้อ่านรายงานหนึ่งฉบับที่ GIS.se ซึ่งเห็นได้รวดเร็วกว่าไฟล์ gdb

เมื่อเวิร์กโฟลว์ประกอบด้วยการทำซ้ำขนาดเล็กจำนวนมากการเรียกเพื่อสร้างตัวประมวลผลทางภูมิศาสตร์และตรวจสอบสิทธิ์ใช้งานมักเป็นส่วนที่แพงที่สุดในการใช้งานหลาม ดังนั้นการทำเท่าที่คุณทำได้ทั้งด้านหน้าหรือด้านหลังgp = ...(หรือimport arcpyใน v10) เป็นเทคนิคหนึ่งที่ฉันใช้บ่อยมาก

ในแง่ของการรวบรวมคำพูดนี้บอกว่าดีที่สุด:

เป็นที่น่าสังเกตว่าในขณะที่เรียกใช้สคริปต์ [python] ที่รวบรวมมี เวลาเริ่มต้นที่เร็วขึ้น(เนื่องจากไม่จำเป็นต้องถูกคอมไพล์) แต่ก็ไม่ได้ทำงานเร็วขึ้น

Mark Cederholm มีการนำเสนอเกี่ยวกับการใช้ArcObjects ใน Pythonด้วยสถิติบางอย่างเกี่ยวกับการดำเนินการ shapecopy (สไลด์ # 4) Python ไม่ยุติธรรมดีมากทำงานที่ 32% ของสิ่งที่สามารถทำได้ด้วย C ++ (VBA คือ 92%, VB & C # ที่ 48%) อย่าไปทำงานและส่งเสียงกรี๊ดเร็วเกินไปเครื่องมือทางภูมิศาสตร์จำนวนมากเป็นสคริปต์ของไพ ธ อนอยู่ดี (ค้นหาไฟล์ c: \ program \ arcgis \ สำหรับ '* .py')

ดังที่หลายคนกล่าวไว้ในสถานที่อื่น ๆ ด้วยงูใหญ่เวลาที่ใช้ในการพยายามเพิ่มประสิทธิภาพโดยการรวบรวมหรือการเขียนฟังก์ชั่นหลักของ C หรือ C ++ มักจะแคระประสิทธิภาพที่เพิ่มขึ้นจริง (อาจ) ที่รันไทม์ หลายคนกล่าวว่าประโยชน์หลักของไพ ธ อนคือการเพิ่มประสิทธิภาพและปรับปรุงเวลาของนักพัฒนา ความสนใจของมนุษย์นั้นมีค่าและมีราคาแพงกว่าเวลาประมวลผลของเครื่องจักรอย่างมากมาย


1
ใช่ในทุกสิ่ง สำหรับเงินของฉันการใช้เวลาของนักพัฒนาที่เหมาะสมที่สุดคือการสร้างต้นแบบ * ใน Python, มาตรฐาน, เลื่อนลงไปที่ C / C ++ เพื่อเพิ่มประสิทธิภาพคอขวด * ฉันพูดต้นแบบ แต่ฉันรู้ว่า 95% ของเวลาที่ 'ต้นแบบ' กำลังจะผลิต
Jason Scheirer

ความคิดเห็นที่ดีและขอบคุณสำหรับลิงค์ใน ArcObjects ใน Python ฉันคิดว่าการเขียนไปที่ GDB มีประโยชน์จากมุมมองการจัดการข้อมูลเทียบกับ shapefile (ข้อ จำกัด ของตารางแอตทริบิวต์ใน shapefiles เทียบกับคลาสคุณลักษณะการแสดงรูปทรงเรขาคณิตการจัดการข้อมูลโดยรวม ฯลฯ ) รวมถึงสิ่งที่คุณทำได้ง่ายขึ้นและสะอาดขึ้น สภาพแวดล้อมการเข้าถึงเทียบกับการจัดการกับไฟล์ DBF ดังนั้นโดยทั่วไปแล้วการแลกเปลี่ยนผลประโยชน์กับสิ่งที่คุณทำและสิ่งที่คุณจะต้องทำกับข้อมูลผลลัพธ์ พื้นกลางของ rasters ภายนอก GDB และทุกอย่างอื่นใน GDB ดูเหมือนจะทำงานได้
turkishgold

1

คุณไม่สามารถรวบรวมไพ ธ อนโค้ดกับรหัสเครื่องได้ เมื่อมันรันครั้งแรกมันจะคอมไพล์เป็น 'bytecode' ซึ่งเป็นภาษากลาง (ซึ่งสร้างไฟล์ pyc)

py2exe ล้อมรอบไฟล์ dll ที่ล่ามและไฟล์ไพ ธ อน / ไฟล์ภายนอกที่ต้องการให้เป็นไฟล์ปฏิบัติการ ไม่ได้รวบรวม - รันไทม์ไม่ควรแตกต่างกันมาก

เป็นไปได้ที่จะทำให้รหัส Python ทำงานเร็วมากโดยใช้เทคนิคที่แตกต่างกัน

สิ่งแรกที่คุณควรทำคือทำการใส่รหัสเพื่อหาคอขวด เมื่อพบแล้วฉันมักจะใช้กระบวนการนี้:

  • กำจัดลูป 'for' โดยใช้อาร์เรย์ numpy หรือฟังก์ชั่น map () สิ่งนี้จะผลักลูปเป็น C
  • ตรวจสอบการใช้อัลกอริทึมที่ดีกว่า (ประเภทนี้จะทำงานพร้อมกันกับด้านบน) สิ่งต่าง ๆ เช่นการลดจำนวนการดำเนินการ I / O ทำให้มั่นใจได้ว่าข้อมูลจะถูกเข้าถึง / จัดเก็บในบล็อกที่ต่อเนื่องกัน
  • ล่าม 'เล่ห์เหลี่ยม' เช่นหลีกเลี่ยงการค้นหาที่มีราคาแพงภายในลูปหลีกเลี่ยง 'ถ้า' บล็อกในลูป (ใช้ 'ลอง' แทน)
  • สร้างโปรไฟล์อีกครั้ง
  • หากยังช้าเกินไปให้ดูที่การผลักชิ้นส่วนที่สำคัญลงใน C โดยใช้ Cython (หรือเขียนโดยตรงใน C การสร้าง dll และการใช้ ctypes เพื่อโทรหา)
  • โปรไฟล์อีกครั้ง
  • หากยังช้าเกินไปให้ดูที่การคำนวณแบบขนานหรือ GPU (ไลบรารีมัลติโปรเซสเซอร์, pyCUDA, ParallelPython ฯลฯ )

0

หากคุณนำเข้าสคริปต์ python จากตำแหน่งอื่นจะสร้างไฟล์. pyc ดังนั้นวิธีง่ายๆในการทดสอบว่าการคอมไพล์สร้างความแตกต่างได้หรือไม่คือเปลี่ยนสคริปต์ของคุณเป็นฟังก์ชัน (เช่น main ()) หากคุณบันทึกสคริปต์example.pyนั้นให้สร้างไฟล์อื่นด้วยบรรทัดต่อไปนี้:

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

หากคุณใช้เวลาจากภายในสคริปต์และทำงานเมื่อมีการนำเข้าคุณอาจเห็นความแตกต่าง นี่เป็นวิธีที่ใช้เทคโนโลยีต่ำในการทำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.