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.

Zapisz się
Powiadom o
guest
3 komentarzy
Inline Feedbacks
Zobacz wszystkie komentarze
3
0
Zapraszam do skomentowania wpisu.x
()
x