web-dev-qa-db-ja.com

オブジェクト指向とベクターベースのプログラミング

オブジェクト指向とベクターベースのデザインの間で引き裂かれています。オブジェクトが建築全体に与える能力、構造、安全性が大好きです。しかし、同時に、速度は私にとって非常に重要であり、配列に単純な浮動小数点変数があることは、MatlabやPythonのnumpyなどのベクトルベースの言語/ライブラリで本当に役立ちます。

これが私のポイントを説明するために私が書いたコードの一部です

問題:牽引ボラティリティの数値を追加します。 xとyが2つのボラティリティ数である場合、ボラティリティの合計は(x ^ 2 + y ^ 2)^ 0.5です(特定の数学的条件を想定していますが、ここでは重要ではありません)。

この操作を非常に速く実行したいと同時に、人々がボラティリティを間違った方法(x + y)で追加しないようにする必要があります。これらはどちらも重要です。

OOベースのデザインは次のようになります:

from datetime import datetime 
from pandas import *

class Volatility:
    def __init__(self,value):
       self.value = value

    def __str__(self):
       return "Volatility: "+ str(self.value)

    def __add__(self,other):
        return Volatility(pow(self.value*self.value + other.value*other.value, 0.5))

(余談:Pythonを初めて使う人にとって、__add__+演算子をオーバーライドする関数にすぎません)

ボラティリティ値の2つのリストを追加するとします

n = 1000000
vs1 = Series(map(lambda x: Volatility(2*x-1.0), range(0,n)))
vs2 = Series(map(lambda x: Volatility(2*x+1.0), range(0,n))) 

(さておき:Pythonはインデックス付きのリストのようなものです)ここで、2つを追加します。

t1 = datetime.now()
vs3 = vs1 + vs2
t2 = datetime.now()
print t2-t1

マシンで3.8秒で追加が実行されるだけで、与えた結果には、オブジェクトの初期化時間はまったく含まれていません。計時された追加コードのみです。 numpy配列を使用して同じことを実行すると:

nv1 = Series(map(lambda x: 2.0*x-1.0, range(0,n)))
nv2 = Series(map(lambda x: 2.0*x+1.0, range(0,n)))

t3 = datetime.now()
nv3 = numpy.sqrt((nv1*nv1+nv2*nv2))
t4 = datetime.now()
print t4-t3

0.03秒で実行されます。それは100倍以上速いです!

ご覧のとおり、OOP方法は、人々がボラティリティを間違った方法で追加しないように、多くのセキュリティを提供しますが、ベクトルメソッドは非常に高速です!両方を手に入れることができますか?多くの人が同じような設計の選択に遭遇したと思いますが、どのようにしてそれを解決しましたか?

ここでの言語の選択は重要ではありません。 C++またはJavaを使用することをお勧めします。コードはベクターベースの言語よりも高速に実行できます。しかし、それは重要ではありません。他の言語では利用できないライブラリのホストがあるため、Pythonを使用する必要があります。それが私の制約です。その中で最適化する必要があります。

多くの人が並列化やgpgpuなどを提案することを知っています。しかし、最初にシングルコアのパフォーマンスを最大化したいので、両方のバージョンのコードを並列化できます。

前もって感謝します!

14
Ramanuj Lal

ご覧のように、OOP方法は、人々がボラティリティを間違った方法で追加しないように、多くのセキュリティを提供しますが、ベクトルメソッドは非常に高速です!両方を手に入れることができますか?多くの人が同じような設計の選択に遭遇したと思いますが、どのようにしてそれを解決しましたか?

より大きなオブジェクトを設計します。 Pixelオブジェクトには、並列化されたループやGPU画像の変換などの余地がありません。 Imageは、データを取得するために小さなPixelオブジェクトの障壁を通過する必要がないことを条件にしています。

9
user204677

これは、トレードオフに関係するため、明確な答えを出すことができない領域の1つです。ご存知のように、OOもベクターベースも常に優れているわけではありませんが、すべてはソフトウェアの使用方法に依存します。

両方のベストを組み合わせて、VolatilityオブジェクトとVolatilitySeriesオブジェクトの両方を作成することもできます。2番目は概念的には一連のVolatilityオブジェクトを表しますが、内部的には多くのストレージメソッドを使用しています。計算(配列の構造)のベクトル化により適しています。次に、Series(Volatility)よりもVolatilitySeriesを使用する方がはるかに望ましいことをユーザーに説明する必要があります。