Jest to głównie ćwiczenie w uczeniu się Pythona. Napisałem tę funkcję sprawdzania, czy dana liczba jest pierwsza:Wydajność dowolnej()
def p1(n):
for d in xrange(2, int(math.sqrt(n)) + 1):
if n % d == 0:
return False
return True
Wtedy zdałem sobie sprawę, mogę łatwo przerobić go za pomocą dowolnego():
def p2(n):
return not any((n % d == 0) for d in xrange(2, int(math.sqrt(n)) + 1))
Performance-mądry, spodziewałem p2 być szybciej niż, lub co najmniej tak szybko jak p1 ponieważ każda() jest wbudowany, ale za duży-owski prime, p2 jest trochę wolniej:
$ python -m timeit -n 100000 -s "import test" "test.p1(999983)"
100000 loops, best of 3: 60.2 usec per loop
$ python -m timeit -n 100000 -s "import test" "test.p2(999983)"
100000 loops, best of 3: 88.1 usec per loop
używam dowolny() niepoprawnie tutaj ? Czy istnieje sposób, aby napisać tę funkcję za pomocą dowolnej(), tak aby było aż iterating się?
Update: Liczby do jeszcze większej sile
$ python -m timeit -n 1000 -s "import test" "test.p1(9999999999971)"
1000 loops, best of 3: 181 msec per loop
$ python -m timeit -n 1000 -s "import test" "test.p2(9999999999971)"
1000 loops, best of 3: 261 msec per loop
zobacz https://docs.python.org/2/library/functions.html#any wygląda całkiem podobnie do tego, co napisałeś. – njzk2
@ rightføld Zwiększenie o 50% to niewielka różnica? – Barmar
Nie, ale <1000 iteracji jest wystarczająco małą liczbą, że kilka dodatkowych ramek stosu (nie wspominając o rzeczach dziejących się gdzie indziej w twoim komputerze w tym czasie) wciąż jest znaczących w porównaniu do treści pętli. –