Details zum E-Book

Wysoko wydajny Python. Efektywne programowanie w praktyce. Wydanie II

Wysoko wydajny Python. Efektywne programowanie w praktyce. Wydanie II

Micha Gorelick, Ian Ozsvald

E-book

Python jest językiem łatwym do opanowania i przyjemnym dla programisty. Jednak łatwość projektowania nie przekłada się na szybkość działania kodu. W konsekwencji przetwarzanie dużych wolumenów danych czy próba skalowania aplikacji kończą się problemami z wydajnością lub niezawodnością. Niekiedy rozwiązaniem jest zastosowanie procesów szeregowych, w innych przypadkach warto sięgnąć do architektury wielordzeniowej, klastrów lub układów GPU. Relatywnie często okazuje się, że dobre wyniki uzyskuje się w efekcie takiego zmodyfikowania technik kodowania, aby przy wykorzystaniu potencjału Pythona stosować sprawdzone metody poprawy wydajności kodu.

Dzięki drugiemu, poszerzonemu i zaktualizowanemu wydaniu tej książki zdobędziesz wszechstronną wiedzę o czynnikach wpływających na wydajność kodu. Dowiesz się, jakie procesy zachodzą w tle komputera, na jakich zasadach odbywa się przydzielanie pamięci, oraz zyskasz nowe spojrzenie na proces kompilacji do postaci kodu maszynowego. Zapoznasz się z zagadnieniem współbieżności i obliczeń klastrowych. Zaczniesz swobodnie posługiwać się najlepszymi narzędziami Pythona, takimi jak NumPy czy moduł multiprocessing. Z pewnością docenisz techniki zapewniające korzystanie z minimum zasobów, takich jak czas procesora czy pamięć RAM. Opisane tu zagadnienia zilustrowano przykładami kodu oraz poradami najlepszych specjalistów z branży.

W książce:

  • narzędzia NumPy, Cython i Docker
  • znajdowanie wąskich gardeł związanych z wykorzystaniem czasu procesora i pamięci
  • wydajność kodu a odpowiednie struktury danych
  • przyspieszanie obliczeń opartych na macierzach i wektorach
  • zarządzanie wieloma operacjami obliczeniowymi i wejścia-wyjścia
  • przetwarzanie współbieżne i uruchamianie kodu w klastrze

Programowanie w Pythonie: przede wszystkim wydajność i niezawodność!


Słowo wstępne 11

Przedmowa 13

1. Wydajny kod Python 19

  • Podstawowy system komputerowy 19
    • Jednostki obliczeniowe 20
    • Jednostki pamięci 23
    • Warstwy komunikacji 26
  • Łączenie ze sobą podstawowych elementów 27
    • Porównanie wyidealizowanego przetwarzania z maszyną wirtualną języka Python 27
  • Dlaczego warto używać języka Python? 31
  • Jak zostać bardzo wydajnym programistą? 34
    • Sprawdzone praktyki 35
    • Wnioski dotyczące sprawdzonych praktyk korzystania z rozszerzenia Jupyter Notebook 37
    • Niech praca znów sprawia radość 38

2. Użycie profilowania do znajdowania wąskich gardeł 39

  • Efektywne profilowanie 40
  • Wprowadzenie do zbioru Julii 41
  • Obliczanie pełnego zbioru Julii 45
  • Proste metody pomiaru czasu - instrukcja print i dekorator 48
  • Prosty pomiar czasu za pomocą polecenia time systemu Unix 51
  • Użycie modułu cProfile 52
  • Użycie narzędzia snakeviz do wizualizacji danych wyjściowych modułu cProfile 57
  • Użycie narzędzia line_profiler do pomiarów dotyczących kolejnych wierszy kodu 57
  • Użycie narzędzia memory_profiler do diagnozowania wykorzystania pamięci 63
  • Introspekcja istniejącego procesu za pomocą narzędzia py-spy 68
  • Kod bajtowy od podszewki 69
    • Użycie modułu dis do sprawdzenia kodu bajtowego narzędzia CPython 69
    • Różne metody, różna złożoność 71
  • Testowanie jednostkowe podczas optymalizacji w celu zachowania poprawności 73
    • Dekorator @profile bez operacji 73
  • Strategie udanego profilowania kodu 76
  • Podsumowanie 77

3. Listy i krotki 79

  • Bardziej efektywne wyszukiwanie 82
  • Porównanie list i krotek 84
    • Listy jako tablice dynamiczne 85
    • Krotki w roli tablic statycznych 88
  • Podsumowanie 89

4. Słowniki i zbiory 91

  • Jak działają słowniki i zbiory? 94
    • Wstawianie i pobieranie 94
    • Usuwanie 97
    • Zmiana wielkości 98
    • Funkcje mieszania i entropia 99
  • Słowniki i przestrzenie nazw 102
  • Podsumowanie 105

5. Iteratory i generatory 107

  • Iteratory dla szeregów nieskończonych 111
  • Wartościowanie leniwe generatora 112
  • Podsumowanie 116

6. Obliczenia macierzowe i wektorowe 117

  • Wprowadzenie do problemu 118
  • Czy listy języka Python są wystarczająco dobre? 122
    • Problemy z przesadną alokacją 123
  • Fragmentacja pamięci 126
    • Narzędzie perf 128
    • Podejmowanie decyzji z wykorzystaniem danych wyjściowych narzędzia perf 131
    • Wprowadzenie do narzędzia numpy 132
  • Zastosowanie narzędzia numpy w przypadku problemu dotyczącego dyfuzji 135
    • Przydziały pamięci i operacje wewnętrzne 138
    • Optymalizacje selektywne: znajdowanie tego, co wymaga poprawienia 141
  • Moduł numexpr: przyspieszanie i upraszczanie operacji wewnętrznych 143
  • Przestroga: weryfikowanie "optymalizacji" (biblioteka scipy) 146
  • Wnioski z optymalizacji macierzy 148
  • Narzędzie Pandas 150
    • Model wewnętrzny narzędzia Pandas 150
    • Zastosowanie funkcji dla wielu wierszy danych 152
    • Budowanie struktur DataFrame i szeregów z wyników częściowych, a nie przez łączenie 159
    • Zadanie może zostać zrealizowane na więcej niż jeden sposób (i być może szybszy) 160
    • Rada dotycząca efektywnego projektowania z wykorzystaniem narzędzia Pandas 161
  • Podsumowanie 163

7. Kompilowanie do postaci kodu C 165

  • Jakie wzrosty szybkości są możliwe? 166
  • Porównanie kompilatorów JIT i AOT 168
  • Dlaczego informacje o typie ułatwiają przyspieszenie działania kodu? 168
  • Użycie kompilatora kodu C 169
  • Analiza przykładu zbioru Julii 170
  • Cython 170
    • Kompilowanie czystego kodu Python za pomocą narzędzia Cython 171
  • pyximport 173
    • Użycie adnotacji kompilatora Cython do analizowania bloku kodu 173
    • Dodawanie adnotacji typu 175
  • Cython i numpy 179
    • Przetwarzanie równoległe rozwiązania na jednym komputerze z wykorzystaniem interfejsu OpenMP 181
  • Numba 183
    • Użycie narzędzia Numba do kompilacji kodu NumPy dla narzędzia Pandas 185
  • PyPy 186
    • Różnice związane z czyszczeniem pamięci 187
    • Uruchamianie interpretera PyPy i instalowanie modułów 188
  • Zestawienie wzrostów szybkości 189
  • Kiedy stosować poszczególne technologie? 190
    • Inne przyszłe projekty 192
  • Procesory graficzne (GPU) 193
    • Grafy dynamiczne: PyTorch 193
    • Podstawowe profilowanie procesora graficznego 196
    • Elementy wydajności procesorów graficznych 197
    • Kiedy stosować procesory graficzne? 199
  • Interfejsy funkcji zewnętrznych 201
    • ctypes 202
    • cffi 204
    • f2py 206
    • Moduł narzędzia CPython 209
  • Podsumowanie 212

8. Asynchroniczne operacje wejścia-wyjścia 215

  • Wprowadzenie do programowania asynchronicznego 217
  • Jak działają funkcja async i instrukcja await? 219
    • Przeszukiwacz szeregowy 220
    • gevent 222
    • tornado 226
    • aiohttp 229
  • Wspólne obciążenie procesora i urządzeń wejścia-wyjścia 232
    • Proces szeregowy 233
    • Przetwarzanie wsadowe wyników 234
    • Pełna asynchronizacja 237
  • Podsumowanie 240

9. Moduł multiprocessing 243

  • Moduł multiprocessing 246
  • Przybliżenie liczby pi przy użyciu metody Monte Carlo 248
  • Przybliżanie liczby pi za pomocą procesów i wątków 249
    • Zastosowanie obiektów języka Python 250
    • Zastępowanie modułu multiprocessing biblioteką Joblib 256
    • Liczby losowe w systemach przetwarzania równoległego 260
    • Zastosowanie narzędzia numpy 261
  • Znajdowanie liczb pierwszych 264
    • Kolejki zadań roboczych 270
  • Weryfikowanie liczb pierwszych za pomocą komunikacji międzyprocesowej 274
    • Rozwiązanie z przetwarzaniem szeregowym 279
    • Rozwiązanie z prostym obiektem Pool 280
    • Rozwiązanie z bardzo prostym obiektem Pool dla mniejszych liczb 281
    • Użycie obiektu Manager.Value jako flagi 282
    • Użycie systemu Redis jako flagi 284
    • Użycie obiektu RawValue jako flagi 286
    • Użycie modułu mmap jako flagi 287
    • Użycie modułu mmap do odtworzenia flagi 288
  • Współużytkowanie danych narzędzia numpy za pomocą modułu multiprocessing 290
  • Synchronizowanie dostępu do zmiennych i plików 297
    • Blokowanie plików 297
    • Blokowanie obiektu Value 300
  • Podsumowanie 303

10. Klastry i kolejki zadań 305

  • Zalety klastrowania 306
  • Wady klastrowania 307
    • Strata o wartości 462 milionów dolarów na giełdzie Wall Street z powodu kiepskiej strategii aktualizacji klastra 309
    • 24-godzinny przestój usługi Skype w skali globalnej 309
  • Typowe projekty klastrowe 310
  • Metoda rozpoczęcia tworzenia rozwiązania klastrowego 311
  • Sposoby na uniknięcie kłopotów podczas korzystania z klastrów 312
  • Dwa rozwiązania klastrowe 313
    • Użycie modułu IPython Parallel do obsługi badań 314
    • Operacje równoległe narzędzia Pandas z wykorzystaniem biblioteki Dask 316
  • Użycie systemu NSQ dla niezawodnych klastrów produkcyjnych 321
    • Kolejki 321
    • Publikator/subskrybent 322
    • Rozproszone obliczenia liczb pierwszych 324
  • Inne warte uwagi narzędzia klastrowania 328
  • Docker 329
    • Wydajność Dockera 329
    • Zalety Dockera 332
  • Podsumowanie 334

11. Mniejsze wykorzystanie pamięci RAM 335

  • Obiekty typów podstawowych są kosztowne 336
    • Moduł array zużywa mniej pamięci do przechowywania wielu obiektów typu podstawowego 337
    • Mniejsze zużycie pamięci RAM w bibliotece NumPy dzięki narzędziu NumExpr 340
  • Analiza wykorzystania pamięci RAM w kolekcji 343
  • Bajty i obiekty Unicode 345
  • Efektywne przechowywanie zbiorów tekstowych w pamięci RAM 346
    • Zastosowanie metod dla 11 milionów tokenów 347
  • Modelowanie większej ilości tekstu za pomocą narzędzia FeatureHasher biblioteki scikit-learn 355
  • Wprowadzenie do narzędzi DictVectorizer i FeatureHasher 356
    • Porównanie narzędzi DictVectorizer i FeatureHasher w wypadku rzeczywistego problemu 358
  • Macierze rzadkie biblioteki SciPy 360
  • Wskazówki dotyczące mniejszego wykorzystania pamięci RAM 363
  • Probabilistyczne struktury danych 363
    • Obliczenia o bardzo dużym stopniu przybliżenia z wykorzystaniem jednobajtowego licznika Morrisa 365
    • Wartości k-minimum 367
    • Filtry Blooma 371
    • Licznik LogLog 376
    • Praktyczny przykład 380

12. Rady specjalistów z branży 385

  • Usprawnianie potoków inżynierii cech za pomocą biblioteki Feature-engine 385
    • Inżynieria cech w przypadku uczenia maszynowego 386
    • Trudne zadanie wdrażania potoków inżynierii cech 386
    • Wykorzystanie możliwości bibliotek open source języka Python 387
    • Biblioteka Feature-engine usprawnia budowanie i wdrażanie potoków inżynierii cech 388
    • Ułatwienie adaptacji nowego pakietu open source 389
    • Projektowanie, utrzymywanie i zachęcanie do uczestnictwa w rozwoju bibliotek open source 390
  • Bardzo wydajne zespoły danologów 391
    • Ile to potrwa? 392
    • Poznawanie i planowanie 392
    • Zarządzanie oczekiwaniami i dostarczeniem produktu 393
  • Numba 395
    • Prosty przykład 395
    • Najlepsze praktyki i zalecenia 397
    • Uzyskiwanie pomocy 400
  • Optymalizowanie a myślenie 401
  • Narzędzie Social Media Analytics (SoMA) firmy Adaptive Lab (2014) 403
    • Język Python w firmie Adaptive Lab 404
    • Projekt narzędzia SoMA 404
    • Zastosowana metodologia projektowa 405
    • Serwisowanie systemu SoMA 405
    • Rada dla inżynierów z branży 406
  • Technika głębokiego uczenia prezentowana przez firmę RadimRehurek.com (2014) 406
    • Strzał w dziesiątkę 407
    • Rady dotyczące optymalizacji 409
    • Podsumowanie 411
  • Uczenie maszynowe o dużej skali gotowe do zastosowań produkcyjnych w firmie Lyst.com (2014) 412
    • Projekt klastra 412
    • Ewolucja kodu w szybko rozwijającej się nowej firmie 412
    • Budowanie mechanizmu rekomendacji 413
    • Raportowanie i monitorowanie 413
    • Rada 414
  • Analiza serwisu społecznościowego o dużej skali w firmie Smesh (2014) 414
    • Rola języka Python w firmie Smesh 414
    • Platforma 415
    • Dopasowywanie łańcuchów w czasie rzeczywistym z dużą wydajnością 415
    • Raportowanie, monitorowanie, debugowanie i wdrażanie 417
  • Interpreter PyPy zapewniający powodzenie systemów przetwarzania danych i systemów internetowych (2014) 418
    • Wymagania wstępne 419
    • Baza danych 419
    • Aplikacja internetowa 420
    • Mechanizm OCR i tłumaczenie 420
    • Dystrybucja zadań i procesy robocze 421
    • Podsumowanie 421
  • Kolejki zadań w serwisie internetowym Lanyrd.com (2014) 421
    • Rola języka Python w serwisie Lanyrd 422
    • Zapewnianie odpowiedniej wydajności kolejki zadań 423
    • Raportowanie, monitorowanie, debugowanie i wdrażanie 423
    • Rada dla programistów z branży 423
  • Titel: Wysoko wydajny Python. Efektywne programowanie w praktyce. Wydanie II
  • Autor: Micha Gorelick, Ian Ozsvald
  • Originaler Titel: High Performance Python: Practical Performant Programming for Humans, 2nd Edition
  • Übersetzung: Piotr Pilch
  • ISBN: 978-83-283-7185-9, 9788328371859
  • Veröffentlichungsdatum: 2021-01-21
  • Format: E-book
  • Artikelkennung: pytps2
  • Verleger: Helion