Nie mam pojęcia, dlaczego tak się dzieje. Zmywałem niektóre listy i potrzebowałem pętli for
przechodząc od 0 do log(n, 2)
, gdzie n było długością listy. Ale kod był niesamowicie powolny, więc po odrobinie badań odkryłem, że problemem jest generowanie zasięgu. Przykładowy kod do demonstracji:Dlaczego tworzenie zakresu od 0 do dziennika (len (lista), 2) jest tak wolne?
n = len([1,2,3,4,5,6,7,8])
k = 8
timeit('range(log(n, 2))', number=2, repeat=3) # Test 1
timeit('range(log(k, 2))', number=2, repeat=3) # Test 2
Wyjście
2 loops, best of 3: 2.2 s per loop
2 loops, best of 3: 3.46 µs per loop
Liczba badań jest mała (nie chciałem to być uruchomiony więcej niż 10 minut), ale już pokazuje, że jest range(log(n, 2))
o rząd wielkości wolniej niż odpowiednik, używając tylko logarytmu liczby całkowitej. To naprawdę zaskakujące i nie mam pojęcia, dlaczego tak się dzieje. Być może jest to problem na moim komputerze, może problem z Sage'em lub bug Pythona (nie próbowałem tego samego na Pythonie).
Używanie zamiast range
również nie pomaga. Ponadto, jeśli otrzymasz numer z .n()
, test 1 działa z tą samą prędkością 2.
Czy ktoś wie, co może się dziać? Dzięki!
Brzmi jak Sage (może Cython?) Problem . Python 'range' nie bierze nawet float. –
Python również nie ma 'log' w globalnej przestrzeni nazw (i nie ma możliwości, aby go tam dostać bez dodawania' setup' do 'timeit'). Oraz 'n' nie jest dostępne również dla' timeit'. I nie ma parametru 'repeat' na' timeit' (który zakładam masz z 'od timeit import timeit'). – abarnert
Czy dane wyjściowe raczej nie pokazują, że wartości zwracane przez 'timeit' są raczej losowe? Po tym wszystkim wypróbowałeś to samo dwa razy (zarówno 'n' jak i' k' to 8), i otrzymałeś masywnie różne wyniki. – Alfe