Nesneye yönelik ve vektör tabanlı tasarım arasında kaldım. Nesnelerin tüm mimariye verdiği yetenekleri, yapıyı ve güvenliği seviyorum. Fakat aynı zamanda hız benim için çok önemli ve bir dizide basit değişken değişkenlere sahip olmak Matlab veya Python'daki numpy gibi vektör tabanlı diller / kütüphanelerde gerçekten yardımcı oluyor.
İşte benim açımdan göstermek için yazdığım bir kod parçası
Sorun: Yedekte volatilite sayıları ekleme. X ve y iki volatilite sayısı ise, volatilitenin toplamı (x ^ 2 + y ^ 2) ^ 0.5'tir (belirli matematiksel koşulun varsayılarak, ancak burada önemli değildir).
Bu işlemi çok hızlı yapmak istiyorum ve aynı zamanda insanların uçuculuğu yanlış şekilde eklememelerini sağlamalıyım (x + y). Bunların her ikisi de önemlidir.
OO tabanlı tasarım şöyle bir şey olurdu:
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))
(Kenara: Python'da yeni olanlar için __add__
, sadece +
operatörü geçersiz kılan bir işlevdir )
Diyelim ki oynaklık değerlerinin yedek listelerini ekliyorum
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)))
(Bir yana: Yine, Python bir dizi bir tür bir dizin listesi) Şimdi ikisini eklemek istiyorum:
t1 = datetime.now()
vs3 = vs1 + vs2
t2 = datetime.now()
print t2-t1
Sadece ekleme makinemde 3.8 saniye içinde çalışıyor, verdiğim sonuçlar nesne başlatma süresini hiç içermiyor, sadece zamanlanmış ekleme kodu. Aynı şeyi numpy dizileri kullanarak çalıştırırsam:
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 saniye içinde çalışır. Bu 100 kat daha hızlı!
Gördüğünüz gibi, OOP yolu, insanların Volatilite'yi yanlış şekilde eklemeyecekleri için çok fazla güvenlik sağlıyor, ancak vektör yöntemi çok hızlı! İkisini de alabileceğim bir tasarım var mı? Birçoğunuzun benzer tasarım seçenekleriyle karşılaştığınızdan eminim, bunu nasıl yaptınız?
Burada dil seçimi önemsizdir. Birçoğunuzun C ++ veya Java kullanmasını tavsiye edeceğini biliyorum ve kod yine de vektör tabanlı dillerden daha hızlı çalışabilir. Ama mesele bu değil. Python kullanmam gerekiyor, çünkü diğer dillerde mevcut olmayan bir dizi kütüphanem var. Bu benim kısıtlamam. İçinde optimizasyon yapmam gerekiyor.
Ve biliyorum, birçok insan paralelleştirme, gpgpu vb. Önerecektir. Ama önce tek çekirdekli performansı en üst düzeye çıkarmak istiyorum ve sonra kodun her iki versiyonunu da paralelleştirebilirim.
Şimdiden teşekkürler!