Bir Python betiğinin profilini nasıl oluşturabilirsiniz?
Project Euler ve diğer kodlama yarışmaları genellikle maksimum çalışma süresine sahiptir veya insanlar kendi çözümlerinin ne kadar hızlı çalıştığıyla övünürler. Python'da bazen yaklaşımlar biraz karmaşıktır - örneğin, `main'e zamanlama kodu eklemek gibi.
Bir python programının çalışmasının ne kadar sürdüğünün profilini çıkarmanın iyi bir yolu nedir?
1198
3
Python cProfile adında bir profil oluşturucu içerir. Yalnızca toplam çalışma süresini vermekle kalmaz, aynı zamanda her işlevi ayrı ayrı zamanlar ve her işlevin kaç kez çağrıldığını söyleyerek nerede optimizasyon yapmanız gerektiğini belirlemenizi kolaylaştırır.
Bunu kodunuzun içinden veya yorumlayıcıdan şu şekilde çağırabilirsiniz:
Daha da kullanışlı olarak, bir komut dosyasını çalıştırırken cProfil'i çağırabilirsiniz:
Bunu daha da kolaylaştırmak için 'profile.bat' adında küçük bir toplu iş dosyası oluşturdum:
Yani tek yapmam gereken koşmak:
Ve bunu anlıyorum:
DÜZENLEME: PyCon 2013'ten iyi bir video kaynağının bağlantısı güncellendi Python Profiling [Ayrıca YouTube üzerinden](https://www.youtube.com/watch?v=QJwVYlDzAXs).
Profilleyiciyi kullanmanın yalnızca ana iş parçacığında (varsayılan olarak) çalıştığını ve bunları kullanırsanız diğer iş parçacıklarından herhangi bir bilgi alamayacağınızı belirtmek gerekir. Bu durum profilleyici belgelerinde tamamen belirtilmediği için biraz sorun yaratabilir.
Ayrıca iş parçacıklarının profilini çıkarmak istiyorsanız, dokümanlardaki
threading.setprofile()
fonksiyonuna bakmak isteyeceksiniz.Bunu yapmak için kendi
threading.Thread
alt sınıfınızı da oluşturabilirsiniz:ve standart sınıf yerine bu
ProfiledThread
sınıfını kullanın. Bu size daha fazla esneklik sağlayabilir, ancak özellikle sınıfınızı kullanmayacak üçüncü taraf kod kullanıyorsanız buna değeceğinden emin değilim.Virtaal'ın kaynak'de profil oluşturmayı (belirli yöntemler/fonksiyonlar için bile) çok kolay hale getirebilecek çok kullanışlı bir sınıf ve dekoratör vardır. Çıktı daha sonra KCacheGrind'de çok rahat bir şekilde görüntülenebilir.