Python kontra PyPy

Każdy szanujący się pytonista prędzej czy później zauważy, że chociaż język jest fajny, to jednak niezbyt szybki.

Jeżeli potrzebujemy szybkości...

... piszemy w asemblerze C Rust C#

... możemy zastąpić Pythona przez PyPy. Bez zbytniej utraty kompatybilności dostajemy za darmo przyspieszenie rzędu prawie 8x (oficjalne źródła mówią o 7.8-krotnym przyspieszeniu).

A oto prosty przykład pokazujący o co chodzi.

Stara jak świat zagadka mówi, żeby znaleźć wszystkie układy takie, że:

$$\frac{ABC}{DEF}+\frac{GH}{IJ}=1$$

Przy czym A-J to cyfry 0-9, każda pojawia się raz.

Przykładowe rozwiązanie:

451 / 902 + 38 / 76 = 1

Żeby znaleźć wszystkie takie kombinacje (jest ich 96), napiszemy sobie prościutki skrypt w Pythonie:

#!/usr/bin/env python3

from itertools import permutations
import time
start = time.time()
licznik = 0
for p in permutations([x for x in range(10)]):
    a, b, c, d, e, f, g, h, i, j = p[0]*100, p[1]*10, p[2], p[3] * 100, p[4]*10, p[5], p[6]*10, p[7], p[8]*10, p[9]
    if((a + b + c)/(d + e + f) + (g + h) / (i + j) == 1):
        licznik += 1
        print(f'{licznik}: {(a+b+c)}/{(d+e+f)}+{(g+h)}/{(i+j)} = 1')
koniec = time.time()
print("czas wykonania: ", koniec-start)

Na moim wysłużonym komputerze (i7 czwartej generacji, 3.6GHz) powyższy kod wykonuje się w okolicach 4 sekund.

A teraz dokonamy prawie niezauważalnej zmiany w pierwszej linii...


#!/usr/bin/env pypy3
...

Jeżeli uruchomimy skrypt w takiej wersji, czas wykonania spadnie do około dwóch dziesiątych sekundy. Czyli osiem dwadzieścia razy szybciej niż "normalnie".

Zalety?

Szybkość, bez wątpienia.

Wady?

Niekompatybilność z rzadziej używanymi bibliotekami Python. Dopóki używamy popularnych bibliotek typu numpy, math czy pandas, jest ok, ale jeżeli sięgniemy po jakieś bardziej egzotyczne importy, to kod może nie zadziałać z PyPy.

3 komentarze

  1. Pypy bywa nawet 50 razy szybszy (patrz https://zakr.es/blog/2020/06/711-wyrazow-o-optymalizacji/ ) ale… to zależy od zastosowania. Jeśli obliczeń jest sporo, to raczej będzie szybciej. Jeśli mamy coś, co wykonuje się chwilę i chcemy urwać ułamki sekund – niekoniecznie.
    Tak czy inaczej, do zamieszczanych tu zagadek i metody Monte Carlo – idealny.

    No i na koniec: nie trzeba zmieniać shebang, wystarczy wybierać interpreter i podawać plik jako parametr: python3 program.py lub pypy3 program.py

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]