-
nowość
Wysoko wydajny Python. Efektywne programowanie w praktyce - ebook
Wysoko wydajny Python. Efektywne programowanie w praktyce - ebook
Każdy, kto się zetknął z językiem Python, wie, że jest on prosty i przyjazny dla programistów, ale ma też swoje ograniczenia przy pracy z dużymi wolumenami danych szybko pojawiają się problemy z wydajnością i ze skalowaniem. Niekiedy pomaga mocniejsza konfiguracja sprzętowa, jednak najczęściej kluczowe jest zastosowanie odpowiednich technik programistycznych i właściwych narzędzi.
Dzięki kolejnemu, poszerzonemu i zaktualizowanemu wydaniu tego praktycznego podręcznika zdobędziesz wszechstronną wiedzę o czynnikach wpływających na wydajność kodu. Dowiesz się, jak lokalizować wąskie gardła wydajności i optymalizować kod w programach, które przetwarzają duże wolumeny danych. Lepiej też zrozumiesz zasady implementacji kodu Pythona. W książce poruszono takie zagadnienia jak architektury wielordzeniowe, klastry, skalowanie systemu poza limity pamięci RAM lub z wykorzystaniem procesorów graficznych. Zaprezentowano praktyczne sposoby radzenia sobie z różnymi wyzwaniami, przybliżono również optymalizację kodu Pythona w wielu realnych scenariuszach, w tym na przykład w sytuacji wyodrębniania danych generatywnej sztucznej inteligencji i uczenia maszynowego w wersji produkcyjnej.
W książce:
- narzędzia NumPy i Cython, a także narzędzia profilujące
- wyszukiwanie wąskich gardeł wykorzystania czasu procesora i pamięci
- dobór odpowiednich struktur danych, macierze i wektory
- przyspieszanie sieci neuronowych i obliczeń opartych na procesorach GPU
- zarządzanie wieloma operacjami obliczeniowymi i operacjami wejścia-wyjścia
- przetwarzanie współbieżne w klastrze
To lektura obowiązkowa dla każdego programisty Pythona!
Mikhail Timonin, projektant, Engelhart
Spis treści
Przedmowa
1. Wydajny kod w Pythonie
- Podstawowy system komputerowy
- Jednostki obliczeniowe
- Jednostki pamięci
- Warstwy komunikacji
- Porównanie wyidealizowanego przetwarzania z maszyną wirtualną języka Python
- Wyidealizowane przetwarzanie
- Maszyna wirtualna języka Python
- Dlaczego warto używać Pythona?
- Jak zostać bardzo wydajnym programistą?
- Sprawdzone praktyki
- Optymalizowanie pod kątem zespołu, a nie bloku kodu
- Wydajny programista pracujący zdalnie
- Wnioski dotyczące sprawdzonych praktyk korzystania z rozszerzenia Jupyter Notebook
- Twoja praca
- Przyszłość języka Python
- Gdzie się podziała blokada GIL?
- Czy język Python oferuje kompilator JIT?
- Podsumowanie
2. Użycie profilowania do znajdowania wąskich gardeł
- Efektywne profilowanie
- Wprowadzenie do zbioru Julii
- Obliczanie pełnego zbioru Julii
- Proste metody pomiaru czasu - instrukcja print i dekorator
- Prosty pomiar czasu za pomocą polecenia time systemu Unix
- Użycie modułu cProfile
- Użycie narzędzia SnakeViz do wizualizacji danych wyjściowych modułu cProfile
- Użycie narzędzia line_profiler do pomiarów dotyczących kolejnych wierszy kodu
- Użycie narzędzia memory_profiler do diagnozowania wykorzystania pamięci
- Połączenie profilowania procesora i pamięci przy użyciu narzędzia Scalene
- Introspekcja istniejącego procesu za pomocą narzędzia PySpy
- Wyświetlanie interaktywnego stosu wywołań na osi czasu za pomocą narzędzia VizTracer
- Kod bajtowy od podszewki
- Użycie modułu dis do sprawdzenia kodu bajtowego narzędzia CPython
- Analizowanie specjalizacji kodu bajtowego za pomocą narzędzia Specialist
- Różne metody, różna złożoność
- Testowanie jednostkowe podczas optymalizacji w celu zachowania poprawności
- Dekorator @profile bez operacji
- Strategie udanego profilowania kodu
- Podsumowanie
3. Listy i krotki
- Bardziej efektywne wyszukiwanie
- Porównanie list i krotek
- Listy jako tablice dynamiczne
- Krotki w roli tablic statycznych
- Podsumowanie
4. Słowniki i zbiory
- Jak działają słowniki i zbiory?
- Wstawianie i pobieranie
- Usuwanie
- Zmiana wielkości
- Funkcje mieszania i entropia
- Podsumowanie
5. Iteratory i generatory
- Iteratory dla szeregów nieskończonych
- Wartościowanie leniwe generatora
- Podsumowanie
6. Obliczenia macierzowe i wektorowe
- Wprowadzenie do problemu
- Czy listy języka Python są wystarczająco dobre?
- Problemy z przesadną alokacją
- Fragmentacja pamięci
- Narzędzie perf
- Podejmowanie decyzji z wykorzystaniem danych wyjściowych narzędzia perf
- Wprowadzenie do narzędzia numpy
- Zastosowanie narzędzia numpy w przypadku problemu dotyczącego dyfuzji
- Przydziały pamięci i operacje wewnętrzne
- Optymalizacje selektywne: znajdowanie tego, co wymaga poprawienia
- Moduł numexpr: przyspieszanie i upraszczanie operacji wewnętrznych
- Procesory graficzne (GPU)
- Grafy dynamiczne: PyTorch
- Szybkość procesorów graficznych i precyzja obliczeń
- Operacje specyficzne dla procesorów graficznych
- Podstawowe profilowanie procesora graficznego
- Elementy wydajności procesorów graficznych
- Kiedy stosować procesory graficzne?
- Kwestie wydajności w uczeniu głębokim
- Przestroga: weryfikowanie "optymalizacji" (biblioteka scipy)
- Wnioski z optymalizacji macierzy
- Podsumowanie
7. Pandas, Dask i Polars
- Pandas
- Wewnętrzny model biblioteki Pandas
- Format danych Arrow i biblioteka NumPy
- Zastosowanie funkcji względem wielu wierszy danych
- Użycie narzędzia Numba do kompilacji kodu biblioteki NumPy pod kątem biblioteki Pandas
- Budowanie z wyników częściowych zamiast stosowania konkatenacji
- Istnieje więcej sposobów niż jeden (i być może szybszych) na wykonanie zadania
- Porady dotyczące efektywnego projektowania z użyciem biblioteki Pandas
- Biblioteka Dask obsługująca struktury danych rozproszonych i DataFrame
- Diagnostyka
- Przetwarzanie równoległe w bibliotece Pandas z wykorzystaniem biblioteki Dask
- Przetwarzanie równoległe metody apply w ramach biblioteki Dask z użyciem pakietu Swifter
- Szybkie struktury DataFrame dzięki bibliotece Polars
- Podsumowanie
8. Kompilowanie do postaci kodu C
- Jakie wzrosty szybkości są możliwe?
- Porównanie kompilatorów JIT i AOT
- Dlaczego informacje o typie ułatwiają przyspieszenie działania kodu?
- Użycie kompilatora kodu C
- Analiza przykładu zbioru Julii
- Cython
- Kompilowanie czystego kodu w Pythonie za pomocą narzędzia Cython
- pyximport
- Użycie adnotacji kompilatora Cython do analizowania bloku kodu
- Dodawanie adnotacji typu
- Cython i numpy
- Przetwarzanie równoległe rozwiązania na jednym komputerze z wykorzystaniem interfejsu OpenMP
- Numba
- PyPy
- Różnice związane z czyszczeniem pamięci
- Uruchamianie interpretera PyPy i instalowanie modułów
- Zestawienie wzrostów szybkości
- Kiedy stosować poszczególne technologie?
- Interfejsy funkcji zewnętrznych
- ctypes
- cffi
- f2py
- Rozszerzenia narzędzia CPython - język C
- Rozszerzenia narzędzia CPython - język Rust
- Podsumowanie
9. Asynchroniczne operacje wejścia-wyjścia
- Wprowadzenie do programowania asynchronicznego
- Jak działają funkcja async i instrukcja await?
- Sieciowy przeszukiwacz szeregowy
- Asynchroniczny przeszukiwacz sieciowy
- Wspólne obciążenie procesora i urządzeń wejścia-wyjścia
- Obciążenie procesora przez proces szeregowy
- Obciążenie procesora przez przetwarzanie wsadowe
- W pełni asynchroniczne obciążenie procesora
- Podsumowanie
10. Moduł multiprocessing
- Moduł multiprocessing
- Przybliżenie liczby pi przy użyciu metody Monte Carlo
- Przybliżanie liczby pi za pomocą procesów i wątków
- Zastosowanie obiektów języka Python
- Zastępowanie modułu multiprocessing biblioteką Joblib
- Liczby losowe w systemach przetwarzania równoległego
- Zastosowanie narzędzia numpy
- Znajdowanie liczb pierwszych
- Kolejki zadań roboczych
- Asynchroniczne dodawanie zadań do kolejki Queue
- Weryfikowanie liczb pierwszych za pomocą komunikacji międzyprocesowej
- Rozwiązanie z przetwarzaniem szeregowym
- Rozwiązanie z prostym obiektem Pool
- Rozwiązanie z bardzo prostym obiektem Pool dla mniejszych liczb
- Użycie obiektu Manager.Value jako flagi
- Użycie systemu Redis jako flagi
- Użycie obiektu RawValue jako flagi
- Użycie modułu mmap jako flagi
- Użycie modułu mmap do odtworzenia flagi
- Współużytkowanie danych narzędzia numpy za pomocą modułu multiprocessing
- Synchronizowanie dostępu do zmiennych i plików
- Blokowanie plików
- Blokowanie obiektu Value
- Podsumowanie
11. Klastry i kolejki zadań
- Zalety klastrowania
- Wady klastrowania
- Strata o wartości 462 milionów dolarów na giełdzie Wall Street z powodu kiepskiej strategii aktualizacji klastra
- 24-godzinny przestój usługi Skype w skali globalnej
- Typowe projekty klastrowe
- Metoda rozpoczęcia tworzenia rozwiązania klastrowego
- Sposoby na uniknięcie kłopotów podczas korzystania z klastrów
- Dwa rozwiązania klastrowe
- Użycie modułu IPython Parallel do obsługi badań
- Użycie brokera komunikatów pod kątem efektywności klastra
- Inne warte uwagi narzędzia klastrowania
- Docker
- Wydajność Dockera
- Zalety Dockera
- Podsumowanie
12. Mniejsze wykorzystanie pamięci RAM
- Obiekty typów podstawowych są kosztowne
- Moduł array zużywa mniej pamięci do przechowywania wielu obiektów typu podstawowego
- Mniejsze zużycie pamięci RAM w bibliotece NumPy dzięki narzędziu NumExpr
- Analiza wykorzystania pamięci RAM w kolekcji
- Bajty i obiekty Unicode
- Efektywne przechowywanie zbiorów tekstowych w pamięci RAM
- Zastosowanie metod dla 11 milionów tokenów
- Modelowanie większej ilości tekstu za pomocą narzędzia FeatureHasher biblioteki scikit-learn
- Wprowadzenie do narzędzi DictVectorizer i FeatureHasher
- Porównanie narzędzi DictVectorizer i FeatureHasher w wypadku rzeczywistego problemu
- Macierze rzadkie biblioteki SciPy
- Wskazówki dotyczące mniejszego wykorzystania pamięci RAM
- Probabilistyczne struktury danych
- Obliczenia o bardzo dużym stopniu przybliżenia z wykorzystaniem jednobajtowego licznika Morrisa
- Wartości k-minimum
- Filtry Blooma
- Licznik LogLog
- Praktyczny przykład
- Podsumowanie
13. Rady specjalistów z branży
- Projektowanie algorytmu uczenia maszynowego o dużej wydajności
- Przyglądanie się danym
- Dedykowane narzędzia analityczne
- Stosowanie odpowiednich metryk ewaluacji
- Klasyczne metody naukowe: badania oparte na hipotezach
- Wykorzystanie w dziennikarstwie obliczeń o dużej wydajności
- Still Loading
- Małe prędkości i szybka iteracja
- Rady z branży reasekuracji cybernetycznej
- Miej jasną wizję problemu i wymagań dotyczących realizacji
- Nie lekceważ znaczenia wiedzy eksperckiej
- Proaktywna ochrona przed złymi danymi
- Zarządzanie narastającym długiem technicznym
- Twórz narzędzia rozszerzające procesy oparte na pracy ludzi
- Podsumowanie
- Zastosowanie języka Python w finansach ilościowych
- Metoda wektoryzacji
- Uproszczone maszyny stanów
- Projektowanie pod kątem wydajności
- Utrzymywanie elastyczności w celu osiągnięcia dużej wydajności
- Twoje największe ograniczenie to Twój własny czas
- Przesuwanie słupków bramki
- Nowe perspektywy
- Rozpoczynanie nowego projektu
- Wartość dobrych danych
- Usprawnianie potoków inżynierii cech za pomocą biblioteki Feature-engine (2020)
- Inżynieria cech w przypadku uczenia maszynowego
- Trudne zadanie wdrażania potoków inżynierii cech
- Wykorzystanie możliwości bibliotek open source języka Python
- Biblioteka Feature-engine usprawnia budowanie i wdrażanie potoków inżynierii cech
- Ułatwienie adaptacji nowego pakietu open source
- Projektowanie, utrzymywanie i zachęcanie do uczestnictwa w rozwoju bibliotek open source
- Bardzo wydajne zespoły danologów (2020)
- Ile to potrwa?
- Poznawanie i planowanie
- Zarządzanie oczekiwaniami i dostarczeniem produktu
- Numba (2020)
- Prosty przykład
- Najlepsze praktyki i zalecenia
- Uzyskiwanie pomocy
- Optymalizowanie a myślenie (2020)
- Technika głębokiego uczenia prezentowana przez firmę RadimRehurek.com (2014)
- Strzał w dziesiątkę
- Rady dotyczące optymalizacji
- Podsumowanie
- Analiza serwisu społecznościowego o dużej skali w firmie Smesh (2014)
- Rola języka Python w firmie Smesh
- Platforma
- Dopasowywanie łańcuchów w czasie rzeczywistym z dużą wydajnością
- Raportowanie, monitorowanie, debugowanie i wdrażanie
| Kategoria: | Programowanie |
| Zabezpieczenie: |
Watermark
|
| ISBN: | 978-83-289-3125-1 |
| Rozmiar pliku: | 11 MB |