Acil | Python hız sorunu

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.

1 Beğeni

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.

İteratorler.

Soru sorarken sikca dusulen hatalar #12

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.

Algoritmayı veya kodu görmeden spesifik bir öneride bulunmak mümkün değil.

İşlem sayısına bakarak hesaplamanın uygun kısımlarını GPU’da yapmayı tavsiye edebilirim. Bu teknoloji işe yarayabilir.

CPU odaklı işlemleri Python’da multihreading kullanarak hızlandıramazsınız çünkü GIL var.

Numpy fonksiyonları bazı durumlarda GIL’i serbest bırakıyor ama onla uğraşmak ne kadar verimli olur bilmiyorum.

1 Beğeni

Donguleri array’lere boyut olarak eklemek buyuk bir hiz kazanci saglayabilir.

Saniyede 111M, gayet hizli.

Saniyede 8. 10 milyon kat daha yavas.

Ne kadar hizlandirman lazim?

864 trilyon kere yapilmasi gereken bir islemden bahsediyoruz. Bir forum postuyla, 1 gun icinde bitirilebilecek bir sey degil. Numba denenebiir ama.

Bize verilen tek bilgi 1440’lik bir dongu olmasi gerektigi. “Dongu kullanma” nasil diyebiliriz ki?


Kisacasi daha fazla bilgiye, koda ihtiyacimiz var. Onun disinda verilen tavsiyeler yeterli, birkac is gunu boyunca denenebilecek tavsiyeler.

Sikintili bir durum olduguna katiliyorum; kolay gelsin ve sonuc ne olursa olsun, gecmis olsun.

1 Beğeni

“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.

1 Beğeni