/ / Dostęp do słownika tylko do odczytu z wieloma wątkami - python, wielowątkowość, python-3.x, python-wielowątkowość

Dostęp do słownika tylko do odczytu z wieloma wątkami - python, wielowątkowość, python-3.x, python-multithreading

Mam listę, L i duży słownik, re który zawiera klucze, K gdzie k jest specyficznym kluczem w K. D [k] zawiera pewne informacje, których potrzebuję, aby określić listę wyników. W tej chwili szukam każdej wartości w K i jeśli informacje, które są dla mnie wartościowe, dołączam do k L. To działa w sposób powtarzalny, ale ja jestemmając nadzieję, że mogę go przyspieszyć dzięki wielowątkowości. Nigdy nie będzie aktualizacji słownika. Jaki byłby dobry sposób na wdrożenie tego?

Odpowiedzi:

2 dla odpowiedzi № 1

Ogólna idea to MapReduce lub Producent-konsument wzór:

Faza mapy / producent: Podziel przestrzeń wyszukiwania przez liczbę procesów, które chcesz odrodzić (i, e., Dla czterech procesów, każdy proces otrzymuje 1/4 kluczy, jak również odniesienie do słownika).

Zmniejsz / Konsument: Gdy proces znajdzie trafienie, wysyła wartość do kolejki wątków.

Po zakończeniu wszystkich procesów kolejka będzie przechowywać wyniki.

Prawie na pewno najbardziej wolną od pracy metodą, jaką znajdziesz, byłoby użycie multiprocessing.Pool.map funkcja (docs)


4 dla odpowiedzi nr 2

W zależności od używanego interpretera Pythona i metod, których używasz podczas przeszukiwania słownika, wielowątkowość prawdopodobnie nie przyspieszy. cpython "s Global Interpreter Lock (GIL) oznacza, że ​​tylko jeden wątek może wykonać kod Pythona w danym momencie.

Teraz, jeśli używasz bibliotek napisanych w C i zoptymalizowanych pod kątem wydajności, mogą wydać GIL, wykonując matematyczne podnoszenie ciężarów (NumPy to dobry przykład). To samo dotyczy wątków oczekujących na I / O. Poza tym, prawdopodobnie skończysz wolniej z wieloma wątkami, ponieważ w przełączaniu kontekstów wątków występuje obciążenie.

W Pythonie zazwyczaj uzyskasz lepszy wynik za pomocą przetwarzanie wielokrotne. Każdy proces będzie miał swój własny GIL, więc kod może działać równolegle. Zakładając, że Twój słownik naprawdę jest tylko do odczytu, jest to wystarczająco łatwe, aby dać kopię słownika każdemu procesowi, który jest tworzony.

Minusem przetwarzania wieloprocesorowego jest to, że istniejewięcej kosztów związanych z komunikacją między wątkami, więc im bardziej izolowane wykonanie, tym lepsze wyniki zobaczysz. Warto również zauważyć, że Windows ma tendencję do posiadania wyższy koszt związany z pojawieniem się nowych procesów, ale nie powinno to stanowić problemu w przypadku każdego procesu związanego z CPU, ponieważ liczba procesów, które będziesz miał, będzie prawdopodobnie bardzo mała.