import neden yavaş?
Python’da import json yazdığında yorumlayıcı epey iş yapar. Dosyayı bulur, gerekirse derler ve modülün içindeki bütün kodu çalıştırır. O modülün kendi import’ları da aynı şekilde yüklenir. Bu zincir tüm bağımlılıklarına kadar iner.
Sorun şu: Programın her çalıştığında bu modüllerin hepsine ihtiyacı yok. Bir komut satırı aracında --help yazdığında, sadece yardım metnini görmek için veri analizi kütüphanesinin yüklenmesini beklemen gerekmez.
Geliştiriciler bunu yıllardır elle çözüyor: Ağır import’u dosyanın başından alıp onu kullanan fonksiyonun içine taşıyorlar. PEP 810’a göre standart kütüphanede test dışındaki import’ların yaklaşık yüzde 17’si bu yüzden fonksiyonların içinde duruyor. Ama bu yöntem zahmetli, dosyanın hangi modüllere bağlı olduğunu gizliyor ve başa eklenen tek bir import tüm emeği boşa çıkarabiliyor.
Yeni yol: lazy
PEP 810 ile Python 3.15’e lazy adında yeni bir anahtar kelime geliyor:
lazy import json
lazy from pathlib import Path
print("Başlıyorum") # json henüz yüklenmedi
veri = json.loads("{}") # json tam burada yükleniyor
lazy import hemen modülü yüklemek yerine bir yer tutucu koyuyor. Gerçek yükleme, o ismi ilk kullandığın anda oluyor. Ondan sonra isim gerçek modülle değiştiriliyor ve sonraki kullanımlarda ek bir maliyet kalmıyor.
lazy bir “yumuşak” anahtar kelime, yani başka yerlerde değişken adı olarak kullanmaya devam edebilirsin. Sadece modülün en üst seviyesinde çalışıyor. Fonksiyonun, sınıfın ya da try bloğunun içinde, from x import * ile birlikte kullanamazsın.
Her import’u tek tek işaretlemek istemezsen genel bir anahtar da var. PYTHON_LAZY_IMPORTS=all ortam değişkeni ya da -X lazy_imports=all seçeneğiyle tüm import’ları tembel hâle getirebilirsin. Eski Python sürümlerini de destekleyen kod için __lazy_modules__ adında bir liste tanımlanabiliyor. Eski sürümler bu listeyi görmezden geliyor.
“3 kat” nereden geliyor?
Videodaki “3 kat daha hızlı” iddiası, Python çekirdek geliştiricisi Hugo van Kemenade’nin ölçümüne dayanıyor. O ölçüm, final sürümden önceki bir deneme sürümüyle yapıldı. Kendi komut satırı aracı pypistats --help için:
- Tüm import’lar en üstte, normal yükleme: yaklaşık 104 ms.
- Ağır import’ları elle fonksiyonlara taşıyınca: yaklaşık 46 ms.
- Tüm import’lar en üstte, hepsi tembel: yaklaşık 36 ms.
PEP’in kendisi de komut satırı araçlarında açılış süresinin pratikte yüzde 50 ile 70 arasında kısalabileceğini söylüyor. Ama bunlar tek tek örnekler. Kazanç, programının ne kadar ağır bağımlılık yüklediğine göre değişir.
Dikkat etmen gerekenler
- Hatalar geç gelir. Modül yoksa
ImportErrorimport satırında değil, ismi ilk kullandığın yerde çıkar. Hata kaydı iki yeri de gösteriyor. - Yan etkiler kayar. Bazı modüller yüklenirken bir şey yapar, örneğin kendini bir eklenti listesine kaydeder. Tembel yüklenirse bu kayıt ancak ilk kullanımda olur, hiç kullanılmazsa hiç olmaz.
Bu yüzden her şeyi topluca tembel yapmak bazı kodları bozabilir. Daha güvenli yol, sadece ağır olduğunu bildiğin import’ları lazy ile işaretlemek.
Ne zaman?
PEP 810 kabul edildi ve Python 3.15’te. Videoda 3.15’in 1 Ekim’de çıktığı söyleniyor, ama resmî takvime göre son aday sürüm 2 Ekim’de yayınlandı. Final sürüm 9 Ekim 2026’da bekleniyor.
Düşün
- Kullandığın bir Python aracının açılması ne kadar sürüyor? Hangi import’lar bunun sebebi olabilir?
- Bir hatanın programın başında değil de çok sonra çıkması, hata ayıklamayı nasıl etkiler?
Kaynaklar (5, İngilizce)
- Better Stack: Python Starts 3X Faster With Lazy Imports (short) (yeni sekmede açılır)
- PEP 810: Explicit lazy imports (yeni sekmede açılır)
- What's New In Python 3.15 (yeni sekmede açılır)
- PEP 790: Python 3.15 Release Schedule (yeni sekmede açılır)
- Hugo van Kemenade: Three times faster with lazy imports (yeni sekmede açılır)
Kendi cümlelerimizle yazılmış bir özettir, çeviri değildir. Tüm kaynaklar yukarıda.