• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czy funkcje rekurencyjne opłacają się w pythonie?

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
1,628 wizyt
pytanie zadane 16 lipca 2017 w Python przez Krystian Nowak Początkujący (330 p.)

Witam, napisałem sobie dwie funkcje liczące kolejne potęgi dwójki, jedną iteracyjnie za pomocą for'a, drugą rekurencyjnie, zaimplementowałem timery żeby sprawdzić jaka będzie różnica w czasie i ku mojemu zdziwieniu pokazują że funkcja licząca za pomocą for'a działa szybciej, dodatkowo maksymalna potęga dwójki jaką jest w stanie policzyć mój komputer rekurencyjnie to 997(8gb ramu), może mi ktoś przybliżyć jak to wygląda z funkcjami rekurencyjnymi w pythonie? Czy biblioteki tego języka są napisane jakoś inaczej w taki sposób że funkcje rekurencyjne się po prostu nie opłacają? Prosiłbym jeszcze o rady na co warto zwrócić uwagę przy przenoszeniu się z innego języka.

import time

def pot(podstawa, potega):
    wynik=podstawa
    for i in range(potega-1):
        wynik=wynik*podstawa
    return wynik


def potreku(podstawa, potega):
    if potega==0: return 1
    else: return podstawa*potreku(podstawa, potega-1)


start=0.0
stop=0.0
czas=0.0

start = time.time()
pot(2,997)
stop = time.time()
czas = stop-start
print(czas)


start = time.time()
potreku(2,997)
stop = time.time()
czas=stop-start
print(czas)

 

komentarz 16 lipca 2017 przez adrian17 Mentor (354,120 p.)

(pewnie wiesz, ale na wszelki wypadek dla przyszłych czytających: potęgi w Pythonie można policzyć też po prostu tak:)

wynik = 2 ** 997

 

2 odpowiedzi

+1 głos
odpowiedź 16 lipca 2017 przez obl Maniak (51,300 p.)
wybrane 16 lipca 2017 przez Krystian Nowak
 
Najlepsza
Przy rekurencji za każdym razem, gdy wywołujesz rekurencyjnie funkcję komputer musi zadeklarować nowy obszar w pamięci. Pamięć jest tutaj dużym ograniczeniem określającym jaki zakres liczb możesz obliczać w ten sposób. Dodatkowo operacja przydzielania pamięci jest powolna i mało wydajna. Przy wykorzystaniu pętli tylko raz deklarujesz wszystkie zmienne i działasz na nich w obrębie jednej funkcji - obliczenia są znacznie szybsze.

Wnioski: kopiowanie pamięci jest powolne i warto o tym pamiętać.
+4 głosów
odpowiedź 16 lipca 2017 przez Kornelia Kobiela Nałogowiec (33,340 p.)
Rekurencja w ogóle jest mniej opłacalna jeśli chodzi o złożoność obliczeniową a im większe liczby, tym mniej się opłaca. Właśnie dlatego wymyślono programowanie dynamiczne.

Podobne pytania

+1 głos
0 odpowiedzi 413 wizyt
0 głosów
0 odpowiedzi 109 wizyt
pytanie zadane 5 sierpnia 2017 w Python przez quisli Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 307 wizyt

93,440 zapytań

142,431 odpowiedzi

322,679 komentarzy

62,802 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...