โครงสร้างข้อมูลสำหรับรหัสปริมาณ จำกัด : Array กับ Classes


11

ฉันต้องเขียนรหัสปริมาณ จำกัด สำหรับ Magnetohydrodynamics (MHD) ฉันเขียนโค้ดตัวเลขมาก่อน แต่ไม่ถึงระดับนี้ ฉันแค่อยากจะถามว่าจะเป็นทางเลือกที่ดีใช้โครงสร้างข้อมูล (object orientated approach) กับคลาสหรือใช้หลายอาร์เรย์สำหรับคุณสมบัติที่แตกต่างกันในแง่ของความเร็วความสามารถในการปรับขยายได้ ฯลฯ ฉันวางแผนที่จะเขียนโค้ดในไพ ธ อน ใช้ fortran สำหรับส่วนที่ต้องใช้ตัวเลข

ตัวอย่างของคลาสในไพ ธ อนจะเป็น

class Cell:
   def __init__(self, x, y, z, U):

อาร์เรย์สามารถนิยามได้ง่ายๆว่า

x[nx][ny][nz]
y[nx][ny][nz]
z[nx][ny][nz]
U[nx][ny][nz]

เป็นต้น

คำตอบ:


9

คำตอบง่ายๆ: ใน python สมัยใหม่ทุกชนิดของข้อมูลเป็นคลาสดังนั้นจึงไม่มีความแตกต่างระหว่างสองวิธีที่คุณเสนอ (โปรดจำไว้ว่าให้ใช้คลาสสไตล์ใหม่: คลาสคลาสสิกล้าสมัย! ดูhttp://docs.python.org/2/reference/datamodel.html#new-style-and-classic-classes )

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

หากคุณจัดระเบียบข้อมูลของคุณเป็นnumpy.ndarrayข้อมูลแล้วเป็นหน่วยความจำที่ต่อเนื่องกันและการเข้าถึงเซลล์แตกต่างกันคือ striding ทำเพียงแค่ผ่านบล็อกหน่วยความจำของคุณ: พื้นที่อย่างมีประสิทธิภาพ (หน่วยความจำไม่มีการสูญเสียสำหรับตัวชี้) และรวดเร็ว

ตามที่อธิบายโดย Ethan แนวคิด OO ควรใช้ แต่ในระดับที่สูงขึ้นเมื่อโครงสร้างข้อมูลระดับต่ำที่มีประสิทธิภาพได้รับการดำเนินการมักจะผ่านnumpy.ndarrayของ

การเขียนโปรแกรม OO หมายถึงการผูกข้อมูลกับวิธีการที่ทำงานกับข้อมูลในระดับที่สูงขึ้นของนามธรรม (ตัวอย่าง: ฉันใช้รหัส FEM ซึ่งเมทริกซ์ความแข็งถูกกำหนดเป็นคลาสที่มีวิธีสำหรับการแยกตัวประกอบแบบซูเปอร์ - โหนด cholesky แบบกระจัดกระจายการใช้งานครั้งแรกในแกน: เมื่อต้องการการใช้งานนอกหลัก ได้มาจากการสืบทอดและการปรับการจัดเก็บข้อมูลที่ขีดเส้นใต้เพียงเล็กน้อยเกือบ 100% ของรหัส cholesky super-nodal ถูกนำมาใช้ใหม่)

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


@EthanCoon ขอบคุณสำหรับความคิดเห็นของคุณในคำตอบอื่น ๆ ที่ทำให้ฉันเขียนหนึ่งของตัวเอง
Stefano M

10

ฉันไตร่ตรองเรื่องนี้เมื่อไม่กี่วันที่ผ่านมา (เช่นกันใน Python) โดยส่วนตัวฉันไม่คิดว่าการเขียนโปรแกรมเชิงวัตถุมักจะเหมาะสำหรับการเขียนโปรแกรมเชิงตัวเลข คุณสามารถฟุ้งซ่านด้วยการออกแบบชั้นเรียนได้มากกว่าแค่การแก้สมการ ฉันชอบที่จะอยู่กับฟังก์ชั่นที่เรียบง่ายและด้วยnumpyคุณสามารถมีสมการเวกเตอร์ของคุณดังนั้นจำนวนบรรทัดที่คุณต้องการมีน้อยมาก Numpy ค่อนข้างเร็วเพราะการคำนวณจริงทำด้วยแบ็คเอนด์ C (หรือ FORTRAN?)

สิ่งที่ฉันอยากจะแนะนำให้คุณทำ

  1. เขียนสคริปต์ Python ที่แก้ปัญหาของคุณได้ง่ายที่สุดโดยใช้วิธีการใช้งานแบบ numpy ตัวอย่างเช่นมีทุกอย่างในหน่วยตามอำเภอใจและลอง 1D (หรือ 2D) เท่านั้น มันเป็นสิ่งที่ดีในช่วงนี้หากรหัสยุ่ง สิ่งสำคัญคือคุณจะก้าวไปข้างหน้ากับโครงการของคุณ
  2. เมื่อคุณมีสิ่งที่ใช้งานได้ ระบุว่ารหัสใดที่ verbose และ refractor ในขั้นตอนนี้คุณสามารถเล่นกับแนวคิดที่แตกต่างกันเกี่ยวกับวิธีลดความซับซ้อนของรหัสของคุณ อาจแนะนำฟังก์ชั่นที่คุณสังเกตเห็นว่าคุณกำลังทำซ้ำตัวเอง คุณสามารถเปรียบเทียบกับเวอร์ชั่นดั้งเดิมเพื่อให้คุณรู้ว่าคุณไม่ได้แนะนำบั๊ก
  3. ตัดสินใจว่าวิธีการปรับทิศทางของวัตถุจะลดความซับซ้อนของรหัสต่อไปหรือไม่

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


3
ฉันไม่เห็นด้วยอย่างยิ่งกับคำสั่งที่ว่า OO นั้นไม่เหมาะสำหรับการเขียนโปรแกรมเชิงตัวเลข แต่ที่ใดที่มันเหมาะสมดีอยู่ในระดับที่สูงกว่ามาก OO มีประโยชน์มากสำหรับสิ่งต่าง ๆ เช่นแบบจำลองฟิสิกส์, ตาข่าย, ตัวแก้ปัญหา ฯลฯ แต่แทบจะไม่เหมาะสมในระดับเซลล์
Ethan Coon

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