Bir sipariş üzerine yaklaşık birkaç trilyon ihtimal analiz eden bir finansal strateji geliştirme programı hazırladım. Analiz programını hazırladım hazırlamasına ama numpy döngüleri yeterli hızda olsa da analiz bölümünü hızlandırmak zorundayım. 600 milyar ihtimal için salt döngü 1.5 saat sürüyor; analiz kısmını eklediğimde ise 2440 analizi 5 dakika civarı bir sürede yapıyor.
Her analiz için yaklaşık 1440 kere liste içinde döngü dönmesi ve 8 kere int değer tanımlanması, 200 kere int değerlerin arttırılması gerekiyor, 5 tane de if condition var. Benim tüm bu processleri hızlandırmam lazım, fakat nasıl? Yardımcı olursanız sevinirim.
“Python ile hızlı döngü yazmanın sırrı python ile döngü yazmamaktır” sözüyle ilişkili (entegrasyon) bir çözüm sunarsanız kaynak vermeniz de çok faydalı olur. Şimdiden teşekkürler.
Thread kullanarak daha fazla işlem yaparak daha hızlı bitirebilirsiniz. Birde siz numpy dan bahsedince aklıma geldi numba kullanabilirsiniz. Sanırım numpy için çalışabiliyordu.
Yaklaşık 1 gün içinde bitirmezsem kötü yorum alacağım. Yeni freelancerlar için kötü yorum sıkıntılı bir durum. Bence acil yazmak için yeterli bir aciliyet.
“Döngü kullanma” lafı o şekilde değil, “python ile döngü yazmamaktır” yani pythonun içerisine farklı bir dili entegre ederek o dilde döngü yazmaktır. Hızlandırmam gereken süre yaklaşık 10 kat. Numba ile 3 kat hızlandı, bir 3 kat daha hızlansa sorun çözülücek. C kullanabiliyorum, dolayısıyla C yazılmış, return ile float değer veren bir fonksiyon da kullanabilirim, fakat pythonda c fonksiyonu çalıştırmayı bir türlü beceremedim.
_isOpen = False
_openPrice = 0
_additionCount = 0
_tpPrice = 0
_stopPrice = 0
_size = 0
_totaladdition = 0
res = 0
for i in range(length, len(close)-1):
startval = min(low[i-(length-1):i+1]) if buypos == "low" else min(open_[i-(length-1):i+1])
changeper = (close[i]-startval)/startval*100
if _tpPrice < high[i] and _isOpen: res += (_tpPrice-_openPrice)/_openPrice*100*leverage*(_size/100)
elif _stopPrice < low[i] and _isOpen: res += (_stopPrice-_openPrice)/_openPrice*100*leverage*(_size/100)
if changeper > changeforstart:
if _isOpen:
if _additionCount < additioncount:
if _additionCount == 0: size = firstaddition
else: size = firstaddition+(additionsize/100*(additionincrease*_additionCount))
_size += size
_additionCount += 1
_openPrice = (_openPrice+close[i])/2
else:
_isOpen = True
_openPrice = close[i]
_additionCount = 0
_size = startsize
_stopPrice = close[i]-close[i]/100*stop
_tpPrice = close[i]+close[i]/100*takeprofit
return res-(startsize+_totaladdition)
Döngünüzü C/C++ ile yazıp DLL dosyası olarak derleyin (gcc kullanabilirsiniz). DLL i Python da kullanmak için de ctypes kütüphanesini kullanabilirsiniz. DLL i nasıl derleyeceğinizi bilmiyorsanız FFI nasıl çalışıyor? - Furkan3 tarafından #38 şu konuda DLL i derleme ve ctypes ta kullanma ile ilgili epey bir şey denemiştim. Konunun kendisi sizin konunuz ile alakasız ama DLL derleme ve kullanma ile ilgili kodlar var. Hatta DLL i nasıl derleyeceğinizi anlatan bir sayfanın linki bile var.
Ben sahsen “dongu kullanmak yerine problemi degistir”, “mikrooptimizasyondan ziyade algoritmik optimizasyona git” veya “yavas kismi bir kutuphane/soyutlama arkasina al” seklinde okuyorum fakat dedigim gibi ornek kod olmadan ikisini de yapmak zor.
Bunun en azindan bir kismi numpy’e gecirilebilirmis ve hizlanma saglanabilirmis gibi geliyor. Fakat nasil bir girdi uzerinde calisiyor ve ciktisi neye benziyor hic bir fikrim yok.
Ayni sey C ile yazilacak fonksiyon icin de gecerli tabi.
(Darbogaz nerede onu da bulamiyorum.)
Nerede takildiginizi soylerseniz daha iyi yardimci olabiliriz. Yoksa genel tutorial’lara link vermekten oteye gidemeyiz.
Bu arada iki yontem var: Birincisi C’yi Python arayuzuyle yazmak, ikincisi Python ile C arayuzunu kullanmak.