Dziękujemy za wyraźne zdefiniowanie pytania i podanie kodu przykład, który próbujesz zoptymalizować.
Wykorzystując dwa podstawowe definicje z pytaniem i notacji ty przewidzianym, ja ogranicza moje optymalizacji próbę użycia list i dodał zdolność losowo zmienić wartości kojarzonych do n, A1, B1, A2 i b2.
W celu pokazania wyników optymalizacji, stworzyłem moduł, który zawiera korzystanie z funkcji random.randit do tworzenia różnych rozmiarach i lista funkcji timeit.Timer uchwycić czas oryginalne pary Funkcja() działa podobnie jak sugerowana optymalizacja w funkcji pairs2().
W funkcji pairs2(), zauważysz, że każda pętla iteracji zawiera instrukcję przerwania . Eliminują one niepotrzebną iterację po każdej liście po spełnieniu wymaganych kryteriów. Powinieneś zauważyć, że w miarę wzrostu wielkości list , poprawia się czas pairs() vs. pairs().
testowy kod modułu:
import random
from timeit import Timer
max_value = 10000
n = random.randint(1, max_value)
a1 = random.randint(0, max_value)
b1 = random.randint(1, max_value+1)
a2 = random.randint(0, max_value)
b2 = random.randint(1, max_value+1)
if b1>n:
b1=n
if b2>n:
b2=n
if a1>=b1:
a1 = random.randint(0, b1-1)
if a2>=b2:
a2 = random.randint(0, b2-1)
diap1 = [x for x in range(a1, b1)]
diap2 = [x for x in range(a2, b2)]
print("Length diap1 =", len(diap1))
print("Length diap2 =", len(diap2))
def pairs(d1, d2, n):
res = 0
same = 0
sl1 = sorted(d1)
sl2 = sorted(d2)
for i in sl1:
for j in sl2:
if i+j==n and i!=j:
res+=1
elif i+j==n and i==j:
same+=1
return(res+same)
def pairs2(d1, d2, n):
res = 0
same = 0
sl1 = sorted(d1)
sl2 = sorted(d2)
for i in sl1:
for j in sl2:
if i+j==n and i!=j:
res+=1
break
elif i+j==n and i==j:
same+=1
break
if res+same>0:
break
return(res+same)
if __name__ == "__main__":
result=0
timer = Timer("result = pairs(diap1, diap2, n)",
"from __main__ import diap1, diap2, n, pairs")
print("pairs_time = ", timer.timeit(number=1), "result =", result)
result=0
timer = Timer("result = pairs2(diap1, diap2, n)",
"from __main__ import diap1, diap2, n, pairs2")
print("pairs2_time = ", timer.timeit(number=1), "result =", result)
Jesteś obliczania 'same' w pętli, ale to nie jest zwracana. Czy rzeczywiście potrzebujesz tej wartości? –
@PiMarillion tak na przykład na wejściu diap1 = [1, 2, 3, 4], diap2 = [1, 2, 3, 4] i n = 4 powinno policzyć parę (2, 2) tylko raz – Steve
Jeśli kodujesz działa, prześlij go do [recenzji kodu] (http://codereview.stackexchange.com/). – sobolevn