• 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?

Object Storage Arubacloud
0 głosów
1,527 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 Ekspert (344,860 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,280 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 347 wizyt
0 głosów
0 odpowiedzi 82 wizyt
pytanie zadane 5 sierpnia 2017 w Python przez quisli Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 188 wizyt

92,555 zapytań

141,402 odpowiedzi

319,552 komentarzy

61,939 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...