Kopiuj
7, 13, 2 | 3 == 3 | True
3, 10, 2 | 4 == 4 | True
4, 9, 3 | 2 == 2 | True
4, 10, 3 | 2 == 2 | True
4, 11, 3 | 2 == 2 | True
4, 12, 3 | 3 == 3 | True
5, 12, 3 | 3 == 3 | True
6, 12, 3 | 3 == 3 | True
10, 20, 10 | 2 == 2 | True
10, 20, 1 | 11 == 11 | True
120321,3210321096, 4 | 802550194 == 802550194 | True
13216,8645198132, 17 | 508540289 == 508540289 | True
Time to complete funkction podzielnosc (in sec): 0.01186
Time to complete funkction podzielnosc2 (in sec): 0.01237
Time to complete funkction licz (in sec): 0.01283
Time to complete funkction licz2 (in sec): 0.00875
Kod w którym już jest masa syfu, ale z testami itd.
Kopiuj
from time import time as tm
def podzielnosc(p, k, d=1):
p_mod_d = p%d
if p_mod_d: suma = len(range(p+(d-p_mod_d), k, d))
else: suma = len(range(p, k, d))
if not k%d: return suma+1
return suma
def podzielnosc2(p, k, d=1):
p_mod_d = p%d
if p_mod_d:
return len(range(p+(d-p_mod_d), k+(d-(k%d)), d))
else:
return len(range(p, k+(d-(k%d)), d))
def licz(pocz, kon, dziel):
resz = pocz % dziel
if resz == 0:
pocz -= dziel
else:
pocz = pocz - resz
kon = kon - (kon % dziel)
return(int(kon / dziel) - int(pocz / dziel))
def licz2(pocz, kon, dziel):
resz = pocz % dziel
if resz:
pocz -= resz
else:
pocz -= dziel
kon -= kon%dziel
return (kon // dziel - pocz // dziel)
def sprawdz(func, wynik, a, b, c=1, show=False):
oczekiwany = func(a,b,c)
if show:
print("{:>4},{:>4},{:>4} | {:^4} == {:^4} | {}".format(a, b, c, oczekiwany, wynik, oczekiwany==wynik))
funkcja_do_testu = licz2
sprawdz(funkcja_do_testu, 3, 7, 13, 2, True)
sprawdz(funkcja_do_testu, 4, 3, 10, 2, True)
sprawdz(funkcja_do_testu, 2, 4, 9, 3, True)
sprawdz(funkcja_do_testu, 2, 4, 10, 3, True)
sprawdz(funkcja_do_testu, 2, 4, 11, 3, True)
sprawdz(funkcja_do_testu, 3, 4, 12, 3, True)
sprawdz(funkcja_do_testu, 3, 5, 12, 3, True)
sprawdz(funkcja_do_testu, 3, 6, 12, 3, True)
sprawdz(funkcja_do_testu, 2, 10, 20, 10, True)
sprawdz(funkcja_do_testu, 11, 10, 20, show=True)
sprawdz(funkcja_do_testu, 802550194, 120321, 3210321096, 4, True)
sprawdz(funkcja_do_testu, 508540289, 13216, 8645198132, 17, True)
tries = 10000
czas_start = tm()
for i in range(tries):
sprawdz(podzielnosc, 508540289, 13216, 8645198132, 17)
sprawdz(podzielnosc, 2, 10, 20, 10)
first_test = round(tm()-czas_start,5)
czas_start = tm()
for i in range(tries):
sprawdz(licz, 508540289, 13216, 8645198132, 17)
sprawdz(licz, 2, 10, 20, 10)
secound_test = round(tm()-czas_start,5)
czas_start = tm()
for i in range(tries):
sprawdz(licz2, 508540289, 13216, 8645198132, 17)
sprawdz(licz2, 2, 10, 20, 10)
third_test = round(tm()-czas_start,5)
czas_start = tm()
for i in range(tries):
sprawdz(podzielnosc2, 508540289, 13216, 8645198132, 17)
sprawdz(podzielnosc2, 2, 10, 20, 10)
fourth_test = round(tm()-czas_start,5)
print ("Time to complete funkction podzielnosc (in sec): ", first_test)
print ("Time to complete funkction podzielnosc2 (in sec): ", fourth_test)
print ("Time to complete funkction licz (in sec): ", secound_test)
print ("Time to complete funkction licz2 (in sec): ", third_test)
Może ktoś jeszcze ma jakiś pomysł jak to przyspieszyć, mnie nic do głowy już nie wpada :)
Cała otoczka też trochę spłaszcza różnicę pomiędzy wynikami, dodatkowy 'if' i kolejne wywołania które są wspólne, ale to nadal pokazuje że nieco podrasowany przykład @sig'a jest najszybszy póki co. I mnie osobiście nie przychodzi do głowy nic jeszcze szybszego, może powinieneś pójść w kod w C zamiast pythona? W samym C mogę się założyć że możnaby to zrobić jeszcze kilkukrotnie szybciej :P
Kopiuj
7, 13, 2 | 3 == 3 | True
3, 10, 2 | 4 == 4 | True
4, 9, 3 | 2 == 2 | True
4, 10, 3 | 2 == 2 | True
4, 11, 3 | 2 == 2 | True
4, 12, 3 | 3 == 3 | True
5, 12, 3 | 3 == 3 | True
6, 12, 3 | 3 == 3 | True
10, 20, 10 | 2 == 2 | True
10, 20, 1 | 11 == 11 | True
120321,3210321096, 4 | 802550194 == 802550194 | True
13216,8645198132, 17 | 508540289 == 508540289 | True
Time to complete funkction podzielnosc (in sec): 0.01282
Time to complete funkction podzielnosc2 (in sec): 0.0122
Time to complete funkction licz (in sec): 0.01288
Time to complete funkction licz2 (in sec): 0.00889
Time to complete funkction licz3 (in sec): 0.00776