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