ฉันจะพยายามตอบคำถามของคุณโดยพิจารณาว่าคุณกำลังขอ Python โดยเฉพาะ ฉันจะอธิบายวิธีการจัดการปัญหาการจำลองของฉันเอง กลยุทธ์สำหรับการจำลองที่เร็วกว่านั้นมีให้ในคำอธิบายนี้
ก่อนอื่นฉันสร้างแบบจำลองใหม่ใน Python แน่นอนฉันพยายามใช้ประโยชน์จากNumPyและSciPyให้มากที่สุดเท่าที่จะทำได้ ในขณะที่ NumPy มีประเภทข้อมูลอาร์เรย์ที่เหมาะสมสำหรับการจำลองเชิงตัวเลข SciPy เสนอรูทีนตัวเลขที่กว้างซึ่งทำงานกับ NumPy arrays
เมื่อต้นแบบทำงานได้มากหรือน้อยฉันพยายามเรียนรู้ว่าส่วนใดของโปรแกรมหรือสคริปต์เป็นคอขวด มีผู้สมัครทั่วไปสำหรับที่:
- การวนซ้ำใน Python ช้า ช้ามาก.
- เนื่องจาก Python ใช้การพิมพ์เป็ดฟังก์ชันการโทรอาจช้า
ฉันใช้กลยุทธ์การทำโปรไฟล์อย่างง่ายเพื่อเรียนรู้ว่าใช้เวลาทั้งหมดเท่าไร ด้วยการใช้IPython shell (ซึ่งฉันไม่สามารถแนะนำได้เพียงพอ) ฉันจึงรันสคริปต์ด้วย
%timeit script.py
"คำสั่งเวทย์มนตร์" นี้จะทำการทำโปรไฟล์ (โดยใช้timeit ) สำหรับคุณและนำเสนอรายการพร้อมกับเวลาที่สคริปต์ของคุณสิ้นสุดลง ใช้รายการนี้เพื่อดูว่ารหัสของคุณช้าเกินไป
เมื่อคุณตอกย้ำส่วนที่ต้องเร่งคุณอาจพิจารณาใช้ภาษาที่รวบรวม ฉันจะชี้ไปที่วิธีแก้ปัญหาสองข้อ
อย่างแรกคือภาษาCython Cython เป็นภาษาการเขียนโปรแกรมคล้ายกับ Python (อันที่จริงแล้ว Python code ก็มักจะเป็น Python code ที่ถูกต้องเช่นกัน); อย่างไรก็ตามคอมไพเลอร์ Cython จะแปลงไฟล์ Cython เป็นรหัส C ซึ่งอาจถูกรวบรวมเป็นโมดูลที่ใช้งานได้จาก Python Cython เข้าใจอาร์เรย์ NumPy มีสองวิธีที่การใช้ Cython สามารถช่วยคุณได้: ขั้นแรกคุณอาจแนะนำชนิดข้อมูล สิ่งนี้จะเร่งความเร็วการเรียกใช้ฟังก์ชัน นอกจากนี้ถ้าคุณวนซ้ำอาร์เรย์อาร์เรย์ของคุณจะทำงานเร็วขึ้น (ในความเป็นจริงถ้าคุณพิมพ์ทั้งตัวแปรจำลองและอาร์เรย์คุณจะได้รับ C วงธรรมดา!) ประการที่สองในการทดลองของฉันแม้แต่สคริปต์ที่ไม่ได้พิมพ์จะทำงานเร็วขึ้นเล็กน้อยเนื่องจากความจริงที่ว่าพวกเขากำลังรวบรวมแทนที่จะตีความ
ภาษาที่รวบรวมอื่น ๆ ที่จะเป็นประโยชน์สำหรับคุณคือ Fortran มีวิธีต่าง ๆ ในการใช้ Fortran กับ Python ( f2py , fortwrap , Cython ) สำหรับฉัน f2py ส่วนตัวดูเหมือนจะเป็นวิธีที่ง่ายที่สุดฉันจะอธิบายสิ่งที่มันทำ f2py สามารถรวบรวมรหัส Fortran ไปยังโมดูล Python มันจะช่วยให้คุณใช้อาร์เรย์ NumPy เป็นตัวแปรอินพุตและเอาต์พุตจากพื้นที่ Python ในพื้นที่ของ Fortran สิ่งเหล่านี้จะเป็นอาร์เรย์ของ Fortran ทั่วไป คุณสามารถใช้งานได้กับความเร็ว Fortran
โดยส่วนตัวแล้วฉันมักจะใช้ Cython ที่จำนวนการเรียกใช้ฟังก์ชันเป็นคอขวด สำหรับสิ่งที่มีน้ำหนักมากฉันชอบ f2py (อาจเป็นเพราะฉันมีพื้นหลัง Fortran ที่แข็งแกร่ง)
ในหมายเหตุเพิ่มเติมเกี่ยวกับ Fortran: Fortran ที่ทันสมัยอ่านและเขียนคล้ายกับ NumPy - ไวยากรณ์อยู่ใกล้มาก สิ่งนี้ทำให้ง่ายต่อการแปลงรหัส NumPy เป็นรหัส Fortran
โปรดทราบว่าทั้ง Cython และ f2py สนับสนุนอัมพาตในบางประการ สำหรับ Cython คุณจะพบความช่วยเหลือได้ที่นี่ส่วน Fortran มีเทคนิคมาตรฐานเช่นOpenMPหรือ MPI นอกจากนี้ยังมีแผ่นปิด P ython สำหรับ MPIอีกด้วย โดยส่วนตัวแล้วฉันใช้ mpi4py ในระดับ Python และ OpenMP ใน Fortran
ให้ฉันแนะนำวรรณกรรมสักหน่อย: หนังสือPython Scripting For Computational Scienceโดย H.-P. Langtangen เป็นทรัพยากรที่ยอดเยี่ยมสำหรับ Python โดยทั่วไปเช่นเดียวกับกลยุทธ์ที่ทำให้ Python เร็วขึ้นเล็กน้อย น่าเสียดายที่ AFAIR ไม่ได้พูดถึงสิ่งใดใน Cython เป็นทรัพยากรที่สองผมคุณอาจดูภาพนิ่งเหล่านี้ เหล่านี้เป็นตัวอย่างสำหรับทุกสิ่งที่ฉันพูดถึงในโพสต์นี้ (ดูรหัสและแหล่งที่นี่ ) มีภาพนิ่งชุดอื่น ๆ อีกมากมายที่ดีบนอินเทอร์เน็ต
หากคุณมีคำถามเพิ่มเติมเรายินดีให้ความช่วยเหลือ!