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.
4 / 0,2 = 20 razy szybszy
Dzięki za czujność – poprawione
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