유한 체적 코드의 데이터 구조 : 배열과 클래스


11

Magnetohydrodynamics (MHD)에 대한 유한 볼륨 코드를 작성해야합니다. 나는이 규모로 전에 숫자 코드를 작성했습니다. 나는 클래스와 함께 데이터 구조 (객체 지향 접근법)를 사용하거나 속도, 확장 성 등의 측면에서 다른 속성에 대해 여러 배열을 사용하여 어느 것이 좋은 선택인지 묻고 싶었습니다. 나는 파이썬으로 코드를 작성하려고합니다. 숫자가 많은 부분에 포트란을 사용하십시오.

파이썬 클래스의 예는 다음과 같습니다.

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

간단한 대답 : 현대 파이썬에서는 모든 데이터 유형이 클래스이므로 공식적으로 제안한 두 솔루션 사이에 차이가 없습니다. (새로운 스타일의 클래스를 사용해야합니다 : 클래식 클래스는 더 이상 사용되지 않습니다! http://docs.python.org/2/reference/datamodel.html#new-style-and-classic-classes 참조 )

이제 문제는 파이썬에서 효율적인 데이터 구조를 어떻게 구성합니까? 셀을 class Cell인스턴스 배열로 구성한다는 아이디어 가 너무 비효율적 이라는 것은 의심의 여지가 없습니다 . 복잡한 연결 목록처럼 구성된 포인터와 비 연속 데이터가 엉망이됩니다. 물론 목록에 새 셀을 쉽게 삽입 할 수 있지만이 기능이 필요합니까? 반대로 비 연속적인 데이터 저장 공간이 있으며 다른 수준의 간접적으로 모든 셀에 액세스해야합니다.

당신은 귀하의 데이터를 구성하는 경우 numpy.ndarray다음 데이터가 메모리의 연속이며, 다른 세포에 접근하는 것은 단순히 완료를 메모리 블록을 통해 스트 라이딩입니다 : 공간 효율 (포인터에 대한 낭비없이 메모리)와 빨리 .

Ethan이 지적한 바와 같이, 효율적인 저수준 데이터 구조가 구현되면 일반적으로 OO 개념을 사용해야하지만 상위 수준에서는 OO 개념이 사용됩니다 numpy.ndarray.

OO 프로그래밍은 데이터 자체에서 더 높은 수준의 추상화로 작동하는 메소드에 데이터를 바인딩하는 것을 의미합니다. (예 : 강성 매트릭스가 희박한 초 노달 콜레 스키 분해를위한 방법으로 클래스로 정의 된 FEM 코드를 구현했습니다. 첫 번째 구현은 코어 내부입니다. 코어 외부 구현이 필요할 때 상속 및 기본 데이터 스토리지에 대한 최소한의 조정을 통해 획득했습니다 . 슈퍼 노드 콜레 스키 코드의 거의 100 %가 재사용되었습니다.)

마지막 주석이지만 중요합니다. 효율적인 수치 절차는 알고리즘과 데이터 구조를 대상 컴퓨팅 아키텍처에 스마트하게 매핑 한 결과입니다. 잘못된 데이터 구조로 시작 하면 완전히 다시 쓰지 않고 효율성을 복구 할 수있는 방법없습니다 .


@EthanCoon 다른 답변에 대한 귀하의 의견에 감사드립니다.
Stefano M

10

나는 며칠 전에 (Python에서도) 숙고했습니다. 개인적으로 객체 지향 프로그래밍이 항상 숫자 프로그래밍에 적합하다고 생각하지 않습니다. 방정식을 풀기보다는 클래스를 디자인하는 데 혼란을 줄 수 있습니다. 나는 간단한 함수를 유지하는 것을 선호하며, numpy를 사용 하면 방정식을 벡터화 할 수 있으므로 필요한 줄 수는 거의 없습니다. 실제 계산은 C (또는 FORTRAN?) 백엔드로 수행되므로 Numpy는 매우 빠릅니다.

내가 추천하는 것은

  1. numpy의 기능적 접근 방식을 사용하여 가능한 가장 간단한 버전의 문제를 해결하는 Python 스크립트를 작성 하십시오. 예를 들어, 모든 것을 임의의 단위로 가지고 1D (또는 2D) 만 시도하십시오. 코드가 지저분하다면이 단계에서 완벽하게 좋습니다. 중요한 것은 프로젝트를 진행하고 있다는 것입니다.
  2. 일단 당신이 작동하는 것을 가지고있다. 코드가 상세하고 굴절 된 위치를 식별하십시오. 이 단계에서는 코드를 단순화하는 방법에 대한 다양한 아이디어를 가지고 놀 수 있습니다. 자신을 반복하고 있음을 알 수있는 기능을 소개 할 수 있습니다. 원래 버전과 비교하여 버그가 발생하지 않았 음을 알 수 있습니다.
  3. 객체 지향 접근 방식으로 코드의 복잡성을 더 줄일 것인지 결정하십시오.

가장 간단한 방법으로 문제를 이미 해결할 때까지 주 메시지는 클래스 작성을 시작하지 않습니다. 문제 해결 경험을 통해서만 객체 지향 인터페이스를 정의하는 방법을 알 수 있습니다. 사전에이 작업을 수행하면 방해가 될 수 있습니다.


3
나는 OO가 수치 프로그래밍에 적합하지 않다는 말에 강력하게 동의하지 않지만, OO가 적합 할 경우 훨씬 높은 수준에 있습니다. OO는 물리 모델, 메시, 솔버 등과 같은 것들에 매우 유용하지만 거의 항상 셀 수준에서 부적합합니다.
Ethan Coon

이 글에서는 특히 코드가 시작될 때 수치 코드의 "조기 객관화"가 발생할 가능성에 대해 경고하고 싶었습니다. 나는 객체를 사용하는 것에 불리하지 않습니다. 제 3의 요점을보십시오. 만약 객체가 복잡성을 줄일 수 있다면 좋은 아이디어입니다. 나는 당신이 인용 한 예가 잘 사용되지만 그 점에 도달하려면 경험이 필요하다는 데 동의합니다.
boyfarrell 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.