オブジェクト指向とベクターベースのデザインの間で迷っています。オブジェクトが建築全体に与える能力、構造、安全性が大好きです。しかし同時に、速度は私にとって非常に重要であり、配列に単純な float 変数を持つことは、Matlab や Python の numpy などのベクトルベースの言語/ライブラリで本当に役立ちます。
ここに私の要点を説明するために書いたコードがあります
問題: 2 つのボラティリティの数値を追加する。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 の Series はインデックス付きのリストのようなものです) 次に、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 の方法は、人々が間違った方法で Volatility を追加することがないように、多くのセキュリティを提供してくれますが、ベクトルの方法は非常に高速です! 両方手に入るデザインはありますか?多くの人が似たようなデザインの選択に出くわしたと思いますが、どのように解決しましたか?
ここでの言語の選択は重要ではありません。多くの人が C++ または Java を使用するようアドバイスすることは知っていますが、いずれにせよ、コードはベクトル ベースの言語よりも高速に実行される可能性があります。しかし、それは重要ではありません。他の言語では利用できないライブラリのホストがあるため、Python を使用する必要があります。それが私の制約です。その中で最適化する必要があります。
そして、多くの人が並列化や gpgpu などを提案することを知っています。しかし、私は最初にシングル コアのパフォーマンスを最大化したいと考えています。それから、両方のバージョンのコードを並列化できます。
前もって感謝します!