Category: Türkçe

Date:

Bugün JsPyConf 2013 etkinliğinde Özgür Vatanseverin "Python Optimizasyon ve Performans Tüyoları" adlı konuşmasını dinledim. Konferansın internetten yayınlanıyor olması çok ama çok iyi oldu. Bu konuşmada tuttuğum notları paylaşmak istiyorum. Bazılarını zaten biliyordum, bazılarını yeni öğrendim. Güzel bir konuşmaydı.

  1. sorted(liste) ile bir listenin elemanlarını yeni bir liste oluşturarak sıralayabilirsiniz. Bu asıl listenin bozulmasını engeller ancak bellekte fazladan yer kaplar. liste.sort() ise yeni bir listeye ihtiyaç duymadan sıralama işlemini yapar. Daha az bellek tüketir.
  2. @memoize tarzı bir decorator oluşturarak bir fonksiyonda hesapladığınız bir sonucu bir dicte yazıp sonradan tekrar kullanabilirsiniz.
  3. Mümkün olduğunda Lazy Evaluation kullanmak gerek. range yerine xrange(0,107) dediğinizde bu büyük listeyi o anda oluşturmaz, next **diyerek elemanlarını tek tek alırsınız. Bellek tasarrufu yapar.
  4. guppy adlı bir kütüphane ile objelerin bellekte ne kadar yer kapladığını görebilirsiniz.
  5. Metin işleri yaparken mümkün olduğunca + işleminden sakının. Onun yerine ".join([item for item in liste]) çok daha hızlı çalışır.
  6. Mümkün olduğunca for döngüsünde listeye append etmek yerine list comprehension ****kullanın: [item for item in liste]
  7. Global ve scope dışı değişken kullanmaktan kaçının. Yavaş olurlar.
  8. Scope dışı değişkenleri lokal gibi isimlendiriseniz daha hızlı çalışır. Çünkü her seferinde scope dışına çıkmak zorunda kalmazlar.

    result = []
    append = result.append
    for i in xrange(1000):
        append(3)

  9. dis.dis metodu kodunuzu Python bytecodea disassemble eder.

  10. Listeleri kuyruk gibi sona eklemek için kullanma. Her eleman eklediğinde daha büyük boyutta yeni bir liste oluşur. Sola ekleme yapmak da elemanların kaymasına sebep olacağı için pahalıdır. Ancak liste elemanları blok halinde yan yana tutulduğu için erişim hızlıdır (O(1)).
  11. dequeue, double-linked-list gibidir. Başında ve sonunda pointer vardır. Blok şeklinde sıralanmadığı için erişim istendiğinde elemanı tek tek arayarak bulur, yavaştır. Ama başa ve sona eklemelerde çok hızlı, O(1) zamanda çalışır. Çünkü kayma olmaz.
  12. CPythonda Global Interpreter Lock problemi var. Yani iki thread aynı anda aynı değişken üzerinde iş göremiyor. Ard arda çalışıyorlar. Threadsiz ard arda çalıştırmak bile daha hızlı olabiliyor. Bunun üstesinden gelmenin yolu ise multi-thread yerine multiprocess çalışmak.
  13. Process oluşturmak thread oluşturmaktan daha pahalı. Ama paralel çalıştıklarında büyük veriler üzerinde çok daha hızlandırıyorlar işi.
  14. Normalde 2 thread ortak bir değişken üzerinde çalışabiliyor ama 2 processin ortak bir değişken üzerinde çalışabilmesi için bu değişkenin main process üzerinde tanımlanması gerekiyor. Eğer bunlar kendi yazdığınız özel sınıflar ise, multiprocessing modülünün managerına register etmek ve nesnenin nasıl pickle edilebileceğini tarif etmeniz gerekiyor.
  15. Multiprocessingdeki map_async fonksiyonu ile bir liste elemanlarının paralel processler ile daha hızlı işlenmesini sağlayabilirsiniz.
  16. Celery, _async ile biten metodlarında multiprocessing kullanıyor.


Share: FacebookGoogle+Email


comments powered by Disqus