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
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üldekiQueue
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
, PriorityQueue
uygulama 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.
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)
- 1. Python'da {} ve [] arasındaki fark nedir?
- 2. UNIX'teki $ @ ve $ * arasındaki fark nedir?
- 3. $ arasındaki fark nedir? ve PowerShell
- 4. Fark() arasındaki fark nedir mustache.js
- 5. heapq
- 6. arasındaki fark nedir?
- 7. Java arasındaki fark nedir
- 8. arasındaki fark nedir?
- 9. arasındaki fark nedir?
- 10. app.doScript ve $ .evalFile arasındaki fark nedir?
- 11. gVim ve gVim arasındaki fark nedir?
- 12. isAlpha ve isLetter arasındaki fark nedir?
- 13. Control.Enter ve Control.GotFocus olayları arasındaki fark nedir?
- 14. .got ve .got.plt bölümü arasındaki fark nedir?
- 15. AutomationProperties.AutomationID ve AutomationProperties.Name arasındaki fark nedir?
- 16. Android'de getDir ve getFilesDir arasındaki fark nedir?
- 17. R içinde `=` ve `<-` arasındaki fark nedir?
- 18. uint ve System.UInt32 arasındaki fark nedir?
- 19. PropertyChangeListener ve VetoableChangeListener arasındaki fark nedir?
- 20. XSS'de IDREF ve IDREFS arasındaki fark nedir?
- 21. Cacerts ve keystore arasındaki fark nedir?
- 22. GPLv2 ve GPLv3 arasındaki fark nedir?
- 23. VarIsEmpty ve VarIsEmptyParam işlevleri arasındaki fark nedir
- 24. ActiveSupport'ta mattr_accessor ve cattr_accessor arasındaki fark nedir?
- 25. Hashtable ve Dictionary arasındaki fark nedir?
- 26. RoutedCommand ve RoutedUICommand arasındaki fark nedir?
- 27. MySQL'deki boolean ve bool arasındaki fark nedir?
- 28. Task.Factory.FromAsync ve BeginX/EndX arasındaki fark nedir?
- 29. WideChar ve AnsiChar arasındaki fark nedir?
- 30. PHP'de 'stripcslashes' ve 'stripslashes' arasındaki fark nedir?