2016-05-02 25 views
14

Python'da, push, pop, nlargest, nsmallest ... vb listelerini uygulayabileceğiniz yerleşik bir heapq algoritması vardır. Bununla birlikte, aynı işlevselliği daha fazla veya daha az destekliyor gibi görünen queue.PriorityQueue sınıfı da var. Fark nedir ve ne zaman diğerini kullanırdınız?Python'da heapq ve PriorityQueue arasındaki fark nedir?

cevap

18

Queue.PriorityQueue iş parçacığı için güvenli bir sınıftır, heapq modülü ise iş parçacığı güvenliği garantisi vermez. Queue module documentation Gönderen:

Queue modül çoklu yapımcı, çok tüketici sıraları uygular. Bilginin birden çok iş parçacığı arasında güvenli bir şekilde değiştirilmesi gerektiğinde, özellikle dişli programlamada kullanışlıdır. Bu modüldeki Queue sınıfı, gerekli tüm kilitleme semantiklerini uygular. Python'da iplik desteğinin kullanılabilirliğine bağlıdır; threading modülüne bakın.

heapq modül hiçbir kilitleme sunar ve evreli olması anlamına gelmez standart list nesneler üzerinde çalışır. Aslında

, PriorityQueueuygulama taban Queue sınıfı bu parçacığı güvenli yapmak için kilitlenmesini sağlayan, bütün önceliklendirme işi yapmak için kaputun altında heapq kullanır. Detaylar için source code'a bakın.

Bu, heapq modülünü daha hızlı hale getirir; Kilitleme yükü yok. Buna ek olarak, çeşitli heapq işlevlerini farklı, yeni yollarla kullanmakta özgürsünüz, PriorityQueue sadece düzgün sıraya alma işlevlerini sunar.

1

queue.PriorityQueue, heapq sınıfı etrafında kısmi bir sarıcıdır.

Diğer bir deyişle, bir queue.PriorityQueue, bir sıra kuyruğu gibi, sıra yığınını daha kolay kullanmak için yeniden adlandırılan birkaç yöntemle sıra modülüne yerleştirilir.

Heapq'da, yeni bir öğe eklemek için heappush() yöntemini ve kaldırmak için yöntem heappop() yöntemini kullanın. Bu çok sıra gibi değil, bu yüzden queue.PriorityQueue, aynı şeyi yapmak için push ve pop gibi sıradaki sıra yöntemlerini kullanmanıza izin verir.

Heapq'ın heappushpop() ve heapreplace() gibi sıraya aktarılmayan bazı özellikleri vardır, ancak bunları kullanmaktan daha azız. Onlara ihtiyacınız varsa (ve şu anki projemde var), queue.PriorityQueue yerine heapq kullanın.

Ayrıca, heapq amacı için özelleştirilmiş olduğundan, bu iş parçacığı güvenli değil (burada başka bir yanıtta belirtildiği gibi)

İlgili konular