Kurs
Ekranın arkasında bir şey olup olmadığını merak etmenize neden olan, uzun süre çalışan bir Python betiğiyle hiç karşılaştınız mı?
İlerlemedeki belirsizlik, neredeyse tamamlanmış bir çalışmayı iptal etmenize ya da zaten kesintiye uğramış bir betiği sonsuza dek beklemenize yol açabilir.
tqdm Python kitaplığı, betikleriniz için ilerleme göstergeleri sağlayarak bu sorunu çözer.

Tqdm Nedir?
Tqdm, döngüler ve yinelenebilirler için hızlı, genişletilebilir ilerleme çubukları sağlayan bir Python kitaplığıdır. Zaman alan görevlerin ilerlemesini takip etmenin basit bir yoludur.
Kitaplığın adı Arapçada "ilerleme" anlamına gelir (taqadum, تقدّم) ve İspanyolcada "seni çok seviyorum"un kısaltmasıdır (te quiero demasiado).
Tdqm, yineleme sayısını sayarak, geçen ve kalan süreyi hesaplayarak ve çubuk dolumunda genel ilerlemeyi görselleştirerek ilerlemeyi takip eder ve ilerleme çubuğu gösterimini günceller.
Kalan süreyi tahmin etmek için akıllı algoritmalar kullanır ve ek yükü en aza indirmek için gereksiz yineleme gösterimlerini atlar. tqdm kullanmanın şu faydaları vardır:
- Görsel geri bildirim: İlerleme çubukları, bir görevin ne kadarının tamamlandığını görmeyi ve kalan kısmın ne kadar sürebileceğini tahmin etmeyi sağlar.
- Her yerde çalışır:
tqdmkitaplığı herhangi bir platformda (Linux, Windows, Mac, FreeBSD, NetBSD, SunOS), herhangi bir konsolda veya bir GUI içinde çalışır. - Kolay entegrasyon:
Tqdm, Jupyter notebook'ları, Pandas gibi yaygın kitaplıklar ve döngüler gibi yaygın Python yapılarıyla sorunsuz bütünleşir. - Özelleştirme: İlerleme çubuklarının görünümünü ve davranışını uyarlamak için çeşitli seçenekler sunar; bunlara daha sonra değineceğiz.
- Performans: Benzer paketler örneğin ProgressBar yineleme başına 800ns ek yüke sahipken, tdqm'in 60ns/yineleme başına ek yükü çok daha hızlıdır.
Tqdm Nasıl Kurulur
Çoğu Python kitaplığında olduğu gibi, tqdm'yi kurmanın en kolay yolu pip paket yöneticisini kullanmaktır.
pip install tqdm
Tqdm: Basit Örnek
Bir ilerleme çubuğu oluşturmak için yinelenebilirimizi (tqdm modülünden içe aktardığımız) tqdm() işleviyle sararız. Basit bir örneğe bakalım. time.sleep(0.01) işlevi, her yinelemede çalıştırılması gereken koda yer tutucu olarak hizmet eder.
from tqdm import tqdm
for i in tqdm(range(1000)):
time.sleep(0.01)
# …

tdqm(range(n)) için bir kısayol olarak trange(n) de kullanabilirsiniz. Aşağıdaki kod, öncekiyle tamamen aynı çıktıyı verir:
from tqdm import tqdm
for i in trange(1000):
time.sleep(0.01)
# …
Her iki örnek de yukarıdakine benzeyen bir ilerleme çubuğu döndürecektir.
İlerleme çubuğuna yakından bakarak hangi bilgileri sunduğunu görün. tqdm'ün sunduğu ayrıntıları şu şekilde bölebiliriz:
- İlerleme Göstergeleri:
- Yinelemelerin Yüzdesi
- Çubuk Dolumu
- Toplam Yinelemenin Kesri
- Metrikler:
- Geçen Süre
- Tahmini Kalan Süre
- Performans (Saniye Başına Yineleme)
Tqdm Özelleştirme: İlerleme Çubuklarını Kendinize Göre Yapın
Tqdm, ilerleme çubuklarının görünümünü ve davranışını uyarlamak için çeşitli özelleştirme seçenekleri sunar. tqdm'ün daha gelişmiş kullanım örneklerine geçmeden önce en önemli özelleştirme parametrelerine bakacağız.
İlerleme çubuğuna açıklama ekleme
Yaygın bir özelleştirme, desc parametresiyle açıklayıcı bir etiket eklemektir; bu, ilerleme çubuğunu daha bilgilendirici hale getirir ve farklı yinelenebilirler üzerinde genel bir bakış sağlamaya yardımcı olur.
Örneğin, desc=”Processing large range” parametresini eklemek, ilerleme çubuğunun solunda “Processing large range” başlığını gösterir.
for _ in tqdm(range(20000000), desc="Processing large range"):
continue
Yukarıdaki kodu ortamınızda desc parametresiyle ve olmadan çalıştırmanızı ve farkları gözlemlemenizi öneririm.
Toplam yineleme sayısını belirtme
total parametresi, döngüdeki toplam yineleme sayısını belirtir ve tqdm'ün kalan süre ve tamamlanma yüzdesine dair daha doğru tahminler vermesini sağlar.
Basit bir örnekte tqdm(range()) veya trange() kullanırken bu gerekli değildir; çünkü yineleme sayısı zaten parantez içinde yer alır. Ancak, total=n (n toplam sayı olmak üzere) parametresinin faydalı olabileceği iki ana senaryo vardır:
1. len() yöntemi olmayan yinelenebilirler: len() yöntemi olmayan, örneğin generator gibi, öğe sayısı bilinmeyen yinelenebilirler için total değerini manuel olarak vermeniz gerekir. Bu parametre olmadan tqdm() yalnızca tamamlanan yineleme sayısını gösterir. Lütfen, gerçek öğe sayısı belirtilen total sayısını aşarsa ilerleme çubuğunun yeniden başladığını unutmayın.
from tqdm import tqdm
import time
import random
# Function generating random number between 1 and 100
def generate_random_numbers():
while True:
yield random.randint(1, 100)
# Without total: tqdm() only shows number of iterations, does not know total
for num in tqdm(generate_random_numbers(), desc=’Random Iteration’):
time.sleep(0.01)
# …

Öğe sayısı bilinmediğinde ve total belirtmediğimizde böyle görünür.
# With total (assuming you know the desired number of iterations): tqdm() shows progress
num_iterations = 1000
for num in tqdm(generate_random_numbers(), total=num_iterations, desc="Random Iteration"):
time.sleep(0.01)
# …

Çok daha iyi, şimdi ilerleme çubuğu görünüyor!
2. Manuel güncellemeler: İlerleme çubuğunu bir işlev içinde update() yöntemiyle manuel olarak güncelliyorsak, doğru ilerleme takibi için total değerinin belirtilmesi gerekir. update() yöntemi örneğin dinamik olarak değişen süreçlere yanıt vermeyi veya özel ilerleme takibi uygulamayı sağlar. Buna daha sonra geleceğiz.
Görsel görünümü ayarlama
İlerleme çubuğu öğelerinin görünme sırasını değiştirmek istersek, bar_format parametresini tercih ettiğimiz biçim dizesine ayarlayabiliriz. Böylece yüzde, geçen süre ve çubuk dolum karakteri gibi çeşitli öğelerin konumunu kontrol edebiliriz. Daha fazla ayrıntı için belgelere bakabilirsiniz.
Görsel görünümde bir başka ayarlama da colour parametresiyle yapılabilir. ‘green’ gibi sözcük dizeleri veya ‘#00ff00’ gibi onaltılık kod dizeleri kullanılabilir.
leave parametresi, görünümden çok kaybolmayla ilgilidir: ilerleme çubuğunun tamamlandıktan sonra görünür kalıp kalmayacağını belirler. True olarak ayarlanırsa, döngü bittiğinde çubuk kalır; False olarak ayarlanırsa kaybolur.
Çıktılardaki görsel farklara başka bir örnekte bakalım. Aşağıdaki kod üç ilerleme çubuğu oluşturur: varsayılan ayarlarla biri, öğe sırasının ve rengin değiştirildiği biri ve tamamlandıktan sonra kaybolacak şekilde ayarlanmış biri. Çıktılar aşağıdaki GIF'te görülebilir.
from tqdm import tqdm
import time
# Progress bar 1: Default settings
for i in tqdm(range(300)):
time.sleep(0.01)
# Progress bar 2: Customized bar format and color
for i in tqdm(range(300), bar_format='[{elapsed}<{remaining}] {n_fmt}/{total_fmt} | {l_bar}{bar} {rate_fmt}{postfix}', colour='yellow'):
time.sleep(0.01)
# Progress bar 3: Customized bar format and color, leave=False
for i in tqdm(range(300), bar_format='[{elapsed}<{remaining}] {n_fmt}/{total_fmt} | {l_bar}{bar} {rate_fmt}{postfix}', colour='red', leave=False):
time.sleep(0.01)

Gelişmiş Kullanım: Daha Karmaşık Senaryoları Ele Alma
Artık basit bir ilerleme çubuğu oluşturmayı ve özelleştirmeyi bildiğimize göre, biraz daha ileri düzey örneklere geçebiliriz.
İç içe ilerleme çubukları
İç içe döngüler, başka döngülerin içinde yer alan döngülerdir. Buna uygun olarak, iç içe ilerleme çubukları da başka döngüler içinde yer alan her döngünün her yinelemesi için bir dizi ilerleme çubuğudur. Bunları oluşturmak için her döngüyü bir tqdm() işleviyle sarın ve her yinelenebilire açıklayıcı etiketler ekleyin.
Aşağıdaki kod üç iç içe döngü içerir ve iç içe ilerleme çubuklarının nasıl görüneceğine dair bir örnek sağlar:
from tqdm import trange
import time
for i in trange(3, desc='outer loop'):
for j in trange(2, desc='middle loop'):
for k in trange(6, desc='inner loop'):
time.sleep(0.01)

Yukarıdaki nihai çıktıda, farklı ilerleme çubuklarının nasıl güncellendiğine dair bir düzen fark edebiliriz. Tqdm her zaman en dış döngüden başlar ve en iç döngüye ulaşana kadar devam eder; en iç döngünün yinelemeleri işlenir ve ilerleme çubuğu buna göre güncellenir.
Diyelim ki örnekteki gibi üç iç içe döngümüz var. İlk iç yinelemeden sonra orta döngüye geçecek, orada bir yinelemenin tamamlandığını güncelleyecek ve sonra tekrar iç yinelenebilire dönecektir. Bu süreç, orta döngü tamamlandı olarak işaretlenene kadar tekrarlanır; bu da dış çubuğun bir yineleme tamamlanmış olarak görünmesini tetikler.
Aynısı dış ve orta döngü arasında da gerçekleşir. Sonunda, son iç çalışma orta yinelenebiliri tamamlar ve bu da son dış yinelemeyi tamamlar.
Manuel güncellemeler
tqdm ile ilerleme çubuklarını manuel güncellemek çeşitli durumlarda faydalı olabilir:
- Uzunluğu bilinmeyen yinelenebilirler: Tanımlı bir uzunluğu olmayan yinelenebilirlerle (ör. generator'lar, ağ akışları) çalışırken, işlenen veri miktarına veya tamamlanan işlemlerin sayısına göre ilerleme çubuğunu manuel olarak güncelleyebiliriz.
- Dinamik olarak değişen süreçler: Yürütme sırasında yineleme sayısı veya yineleme başına işlem süresi değişebiliyorsa, manuel güncellemeler ilerleme çubuğunu buna göre ayarlamamıza olanak tanır.
- Özel ilerleme takibi: İlerleme çubuğu üzerinde daha ayrıntılı kontrol için, belirli ölçütlere veya olaylara göre manuel olarak güncelleyebiliriz. Örneğin, belirli kilometre taşlarının tamamlanmasına ya da daha büyük bir süreç içindeki tekil görevlerin ilerlemesine göre güncellemek isteyebiliriz.
- Haricî sistemlerle entegrasyon:
tqdm'ü ilerlemeyi doğal olarak takip etmeyen haricî sistemler veya kitaplıklarla entegre ediyorsak, manuel güncellemeler ilerleme çubuğunu dış süreçle senkronize etmek için kullanılabilir.
tqdm ilerleme çubuğunu manuel olarak güncellemek için, total parametresinin beklenen maksimum yineleme sayısının tahmini olarak belirtilmesi önemlidir. Ardından, kod her yeni öğeyi işlerken ilerleme çubuğu update() yöntemi kullanılarak güncellenmelidir. Güncelleme değeri, son güncellemeden bu yana işlenen yineleme sayısını temsil etmelidir.
Diyelim ki yinelenebilirimizin 750 öğeye kadar içerik barındırmasını bekliyoruz. Bu örnekte gerçek uzunluk 100 ila 1000 arasında rastgele bir sayıdır ve bizim için bilinmezdir. progress_bar'ı başlatır, estimated_total'ü 750 olarak ayarlarız. Sonra veriler arasında yineleyerek her nokta işlendiğinde ilerleme çubuğunu güncelleriz.
from tqdm import tqdm
def process_data(data):
time.sleep(0.01) # simulate processing data
processed_data = data
return processed_data
# Generate an iterable with random length between 100 and 1,000
random_length = random.randint(100, 1000)
data_list = [i for i in range(random_length)]
# Define estimated maximum number of iterations
estimated_total = 750
# Define the progress bar using the estimated_total
progress_bar = tqdm(total=estimated_total)
# Iterating through data list of unknown length
for data in data_list:
processed_data = process_data(data)
progress_bar.update(1)

Yinelenebilirin uzunluğunu küçümsedik; çıktı %100'e ulaştıktan sonra yinelemeleri saymaya devam ediyor.
Çoklu işlem
Çoklu işlem ve iş parçacığı (threading), görevleri eşzamanlı yürütmek için kullanılan ve performans ile duyarlılığı artıran tekniklerdir. Bu senaryolarda, bireysel görevlerin ya da paralel yürütmenin genel ilerlemesini takip etmek zor olabilir. Tqdm, bu eşzamanlı işlemlerin görsel geri bildirimini sağlamak ve ilerlemesini izlemek için değerli bir araç olabilir.
tqdm.contrib.concurrent modülü, çoklu işlem veya iş parçacığı bağlamlarında ilerleme çubukları oluşturmak için özelleşmiş işlevler sağlar. Bu işlevler, ana işlem ile işçi işlemler veya iş parçacıkları arasındaki senkronizasyonu ve iletişimi ele alır ve ilerleme çubuğunun doğru şekilde güncellenmesini sağlar. concurrent.futures API'siyle sorunsuz çalışacak şekilde tasarlanmıştır ve ProcessPoolExecutor() veya ThreadPoolExecutor() işlevini kullanır.
İşte tqdm.contrib.concurrent.futures modülünü kullanan bir örnek:
import concurrent.futures
from tqdm.contrib.concurrent import process_map
def process_data(data):
for i in tqdm(range(100), desc=f"Processing {data['name']}"):
# Process data
time.sleep(0.01)
if __name__ == '__main__':
with concurrent.futures.ProcessPoolExecutor() as executor:
results = process_map(process_data, [
{'name': 'dataset1'},
{'name': 'dataset2'},
# …
])
Bu örnekte, process_data() işlevi ilerlemesini izlemek için bir tqdm ilerleme çubuğu içerir. process_data() işlevi listedeki her veri öğesi için eşzamanlı olarak yürütülecektir. Bu, birden fazla ilerleme çubuğunun aynı anda görüntüleneceği anlamına gelir; her biri ayrı bir sürecin ilerlemesini temsil eder. desc parametresi, ilgili veri kümesinin adına göre her ilerleme çubuğu için dinamik bir açıklama oluşturacak şekilde ayarlanmıştır; bu da farklı ilerleme çubuklarını ayırt etmemize yardımcı olur.
pandas ile entegrasyon
tqdm.pandas modülü, pandas işlemlerine ilerleme çubukları eklemenin kullanışlı bir yolunu sunar. Bu, büyük DataFrameler üzerindeki zaman alan işlemler için özellikle kullanışlıdır; çünkü görevin ilerleyişine dair görsel geri bildirim sağlar. Satırlar veya sütunlar üzerinde çalışan herhangi bir pandas işlevine tqdm.pandas() dekoratörünü uygulayabiliriz.
Başlamak için, 100.000 satırlı rastgele bir DataFrame tanımlar ve tqdm.pandas() dekoratörünü çağırırız. İlerleme çubuğunu özelleştirmek istiyorsak bunu şimdi yapmalıyız; çünkü progress_apply() ve progress_map() işlevleri tqdm() parametrelerini almaz. Burada aşağıdaki ilerleme çubuklarına bir ad vermek istediğimiz için desc parametresini de belirtiyoruz.
import pandas as pd
import numpy as np
from tqdm import tqdm
df = pd.DataFrame(np.random.randint(0, 10, (100000, 6)))
tqdm.pandas(desc='DataFrame Operation')
Artık işlevleri satırlara, sütunlara veya tüm DataFrame'e uygulayabiliriz. apply() veya map() işlevlerinden birini kullanmak yerine progress_apply() veya progress_map() çağrısı yapın; ilerleme çubuğu görüntülenecektir. Unutmayın, apply() ve progress_apply() DataFrame'lere, satırlara veya sütunlara uygulanabilirken map() ve progress_map() yalnızca Series'lere veya sütunlara uygulanabilir. Örneğin:
# Halving each value in the DataFrame using progress_apply()
Result_apply = df.progress_apply(lambda x: x / 2)
# Doubling each element of the first column using progress_map()
result_map = df[0].progress_map(lambda x: x * 2)
Tqdm: Yaygın Sorunlar ve Çözümler
Bazı yaygın Tqdm sorunlarını ve hatalarını ele alalım ve bunları nasıl düzelteceğimizi öğrenelim.
İlerleme çubuğu güncellenmiyor
tqdm kullanırken en sık karşılaşılan sorunlardan biri, güncellenmeyen bir ilerleme çubuğudur. Bu durum genellikle, özellikle Jupyter Notebook gibi ortamlarda tamponlama sorunlarından kaynaklanır. Çıktı tamponlandığında, ilerleme çubuğu hemen görüntülenmeyebilir veya güncellenmeyebilir ve bu da donmuş ya da yanıt vermeyen bir süreç algısına yol açar.
tqdm.notebook modülünü kullanmak, tamponlama sorunlarını giderebilir ve Jupyter Notebook'larda ilerleme çubuğunun doğru şekilde güncellenmesini sağlayabilir. Bu modül, özellikle Jupyter ortamları için tasarlanmış, GUI tabanlı bir ilerleme çubuğu sağlar.
Ayrıca kullanıcı dostu renk ipuçları sunar (mavi: normal, yeşil: tamamlandı, kırmızı: hata/kesinti).
İç içe ilerleme çubuğu örneğimizdeki kodu kesintiye uğratırsak şöyle görünür:

tqdm.notebook kullanılarak Python'da iç içe ilerleme çubukları; tamamlanan ile kesintiye uğrayan çubukların renk düzenini gösterir.
Güncellenmeyen ilerleme çubuklarını gidermenin bir başka etkili yolu, çıktı akışını açıkça boşaltmaktır (flush). Veriler standart çıktı akışına yazıldığında (ör. print() kullanılarak), veriler genellikle gerçek çıktı aygıtına gönderilmeden önce tamponlanır. Çıktı akışını boşaltmak, Python yorumlayıcısının tamponlanmış verileri hemen çıktı aygıtına göndermesini zorlayarak verilerin gecikmeden görüntülenmesini veya yazılmasını sağlar.
Çıktıyı boşaltmak için standart çıktı akışının flush() yöntemini kullanın. Daha duyarlı bir çıktı için, örneğin her birkaç yinelemeden sonra veya belirli bir süreden sonra, çıktı akışını daha sık boşaltmayı düşünebilirsiniz. Bunun bir ödünleşim olduğunu, çünkü çıktı akışını boşaltmanın ek yük getirebileceğini unutmayın. İşte yöntemi basit bir tqdm sürecine nasıl dahil edebileceğimize dair bir örnek:
import sys
import time
from tqdm import tqdm
for i in tqdm(range(100)):
time.sleep(0.1)
sys.stdout.flush() # Flush the output stream after each iteration
Uyumluluk sorunları
tqdm genel olarak çoğu Python ortamı ve kitaplığıyla uyumlu olsa da, bazen uyumluluk sorunları veya beklenmedik davranışlar olabilir. Dikkat edilmesi gereken yaygın senaryolardan bazıları şunlardır:
- Özel çıktı akışları: Özel çıktı akışları kullanırken veya çıktıyı dosyalara yönlendirirken,
tqdmbeklediğiniz gibi çalışmayabilir. Kullandığımız çıktı akışının, ilerleme çubuğunu görüntülemek için gerekli işlemleri desteklediğinden emin olmamız gerekir. - Üçüncü taraf kitaplıklar: Bazı durumlarda,
tqdmözellikle çıktıyı veya ilerleme takibini kendisi yöneten üçüncü taraf kitaplıklarla beklenmedik şekilde etkileşime girebilir. Sorunu çözüp çözmediğini görmek için ilgili üçüncü taraf kitaplık özelliklerini devre dışı bırakmayı veya değiştirmeyi deneyebiliriz. - Sürüm uyumluluğu:
tqdmve diğer kitaplıkların uyumlu sürümlerini kullanmak her zaman iyi bir uygulamadır. Python'un veya diğer bağımlılıkların belirli sürümleriyle ilgili bilinen uyumluluk sorunları için kitaplık belgelerini kontrol edin.
Uyumluluk sorunlarıyla karşılaştığımızda aşağıdaki geçici çözümleri düşünebiliriz:
- Sürüm düşürme veya yükseltme:
tqdm'ün farklı bir sürümünü deneyebiliriz. - Kodu değiştirme: Gerekirse, uyumluluk çakışmalarını aşmak için kodumuzda ayarlamalar yapabiliriz.
- Topluluktan yardım isteme: Tüm bunlar yardımcı olmazsa,
tqdmtopluluğuna veya çevrimiçi forumlara başvurarak yardım ve olası çözümler arayabiliriz.
Bu olası uyumluluk sorunlarını ve geçici çözümlerini akılda tutarak, tqdm'yi Python projelerimizde kullanırken karşılaşılan sorunları etkili bir şekilde giderebilir ve çözebiliriz.
Sonuç
Sonuç olarak, Tqdm bize ilerleme çubukları ve diğer yararlı istatistikler sağlayan bir Python kitaplığıdır; kod yürütmeyi izlemeyi ve yönetmeyi kolaylaştırır.
İster büyük veri kümeleri üzerinde yineleme yapıyor olun, makine öğrenmesi modelleri eğitiyor olun, ister başka herhangi bir zaman alan işlemi gerçekleştiriyor olun, tqdm kodunuzun durumunu takip etmek ve bilgi sahibi olmak için basit ama güçlü bir yol sunar.
Daha fazla keşif için diğer DataCamp Python eğitimlerine, Tqdm belgelerine veya GitHub'daki kaynak koduna ve Readme dosyasına göz atabilirsiniz.
SSS
tqdm ile basit bir ilerleme çubuğunu nasıl oluştururum?
tqdm kitaplığını kurup içe aktarın, ardından yinelenebilinizi tqdm() işleviyle sarın.
tqdm'i pandas DataFrame'leri veya diğer kitaplıklarla kullanabilir miyim?
Evet, tqdm'ü pandas DataFrame'leri ve diğer kitaplıklarla kullanabilirsiniz. tqdm.pandas modülü, tqdm'ü pandas ile entegre etmek için özel işlevler sağlar.
Tqdm ilerleme çubuğunun görünümünü özelleştirebilir miyim?
Evet, Tqdm'in parametrelerini kullanarak çubuk biçimini, rengini, toplam yineleme sayısını ve daha fazlasını özelleştirebilirsiniz.
Tqdm ilerleme çubuğu doğru şekilde güncellenmiyor, ne yapmalıyım?
Özellikle Jupyter Notebook'larda tamponlama sorunlarını kontrol edin. tqdm.notebook kullanmayı veya çıktıyı açıkça boşaltmayı deneyin. Ayrıca, total parametresini doğru kullandığınızdan emin olun.

Tom bir veri bilimci ve teknik eğitmendir. DataCamp'in veri bilimi eğitim içerikleri ve blog yazılarını yazar ve yönetir. Daha önce Tom, Deutsche Telekom'da veri bilimi alanında çalıştı.