Pracuję nad problemem programowania, w którym muszę obsłużyć liczbę obejmującą 100000 cyfr. Czy Python może obsługiwać takie liczby?Obsługa dużych liczb w kodzie
Odpowiedz
Pewnie, że można:
>>> s = 10 ** 100000
Wydaje się działać prawidłowo:
>>> x = 10**100000
>>> x
10000000000000000000000000000000000000000000000000000000000000000000000000000000
[snip]
00000000L
Według http://docs.python.org/library/stdtypes.html, „Długie liczby całkowite mają nieograniczoną precyzję”, co prawdopodobnie oznacza, że ich wielkość nie jest ograniczona.
Tak; Python 2.x ma dwa typy liczb całkowitych: int o ograniczonym rozmiarze i długi z nieograniczony rozmiar. Jednak w razie potrzeby wszystkie obliczenia zostaną automatycznie przeliczone na długie. Obsługa dużych liczb działa dobrze, ale jedną z wolniejszych rzeczy będzie próba wydrukowania 100000 cyfr na wyjściu, lub nawet próba utworzenia z niego ciągu.
Jeśli potrzebna jest również precyzyjna dziesiętna precyzja w ustalonym punkcie stałym, dostępny jest moduł dziesiętny.
Jak wskazano w innych odpowiedziach, Python obsługuje liczby całkowite ograniczone tylko ilością dostępnej pamięci. Jeśli chcesz jeszcze szybsze wsparcie dla nich, spróbuj gmpy (jako autor gmpy i bieżącej współpracy opiekuna jestem oczywiście trochę stronniczy tutaj ;-):
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'x+1'
10000 loops, best of 3: 114 usec per loop
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'y+1'
10000 loops, best of 3: 65.4 usec per loop
Zazwyczaj arytmetyka nie jest wąskim gardłem dla pracy z takie liczby (chociaż gmpy
bezpośrednie wsparcie dla niektórych funkcji kombinatorycznych i liczbowo-teoretycznych może pomóc, jeśli to właśnie robisz z takimi liczbami). Przechodząc do ciągów liczb dziesiętnych jest prawdopodobnie wspólna operacja, która poczuje najwolniej ...:
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'str(x)'
10 loops, best of 3: 3.11 sec per loop
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'str(y)'
10 loops, best of 3: 27.3 msec per loop
Jak widać, nawet w gmpy
stringification ogromnych liczb może być setki razy wolniej niż prostego dodawania (niestety, jest to nierozerwalnie skomplikowana operacja!); ale w natywnym kodzie Pythona stosunek czasów może iść do uszeregowania, który jest kilkadziesiąt tysięcy razy wolniejszy niż zwykły dodatek, więc naprawdę chcesz na to uważać, zwłaszcza jeśli zdecydujesz się nie pobierać i instalować gmpy
(na przykład z powodu nie możesz: np. gmpy nie jest obecnie obsługiwany w Google App Engine).
Wreszcie przypadek pośredni:
$ python2.6 -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'x*x'
10 loops, best of 3: 90 msec per loop
$ python2.6 -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'y*y'
100 loops, best of 3: 5.63 msec per loop
$ python2.6 -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'y*x'
100 loops, best of 3: 8.4 msec per loop
Jak widać, mnożąc dwie wielkie liczby w natywnym kodzie Pythona może być prawie 1000 razy wolniej niż proste dodanie, podczas gdy z gmpy
spowolnienie jest mniejsza niż 100 razy (i nie jest tak źle, nawet jeśli jest tylko jeden, jeśli liczby są już w formacie własnym gmpy
, więc istnieje dodatkowy koszt konwersji drugiego).
Dziękujemy za gmpy! Używam go do kursu kryptograficznego na Courserze. –
GMPY2 obsługuje bibliotekę GMP dla liczby całkowitej i racjonalnej arytmetyki, ale GMPY2 dodaje obsługę arytmetycznej dużej i rzeczywistej o dużej precyzji, zapewnionej przez biblioteki MPFR i MPC. GMP (Biblioteka arytmetyczna wielokrotnej precyzji GNU) ma być szybsza niż jakakolwiek inna biblioteka bignum dla wszystkich rozmiarów operandów. http://pl.wikipedia.org/wiki/GNU_Multiple_Precision_Arithmetic_Library –
Jak już wspomniano, Python może obsługiwać liczby tak duże, jak pozwala na to Twoja pamięć. Chciałbym tylko dodać, że wraz ze wzrostem liczby wzrasta koszt wszystkich operacji na nich. Nie chodzi tylko o drukowanie/konwertowanie na ciąg (choć jest to najwolniejszy), ale dodanie dwóch dużych liczb (większych niż to, co twój sprzęt może natywnie obsługiwać) nie jest już O (1).
Po prostu wspomniałem o tym, aby podkreślić, że chociaż Python zgrabnie ukrywa szczegóły pracy z dużymi liczbami, nadal należy pamiętać, że te operacje z dużymi liczbami nie zawsze są takie same jak w zwykłych intach.
- 1. Obsługa "dużych" liczb całkowitych w C#
- 2. Biblioteka dużych liczb JavaScript?
- 3. Dzielenie dużych liczb w Pythonie
- 4. Rodzaje dużych liczb
- 5. Obsługa dużych obrazów w iOS
- 6. Logstash: Obsługa dużych wiadomości
- 7. CSS Kerning dla dużych liczb
- 8. Obsługa liczb dziesiętnych w mysqli
- 9. C: Reprezentacja dużych liczb całkowitych
- 10. drukowanie bardzo dużych liczb zmiennoprzecinkowych
- 11. obsługa dużych tablic z array_diff
- 12. Przechowywanie bardzo dużych liczb całkowitych w MySQL
- 13. Obsługa dużych bitmap w edytorze obrazu
- 14. Pisanie systemu liczb binarnych w kodzie C
- 15. JavaScript: toString (36) dla dużych liczb całkowitych
- 16. Formatowanie dużych liczb za pomocą .NET
- 17. Generowanie bardzo dużych liczb losowych java
- 18. Obsługa bardzo małych liczb w pythonie
- 19. Obsługa wielu wersji Pythona w twoim kodzie?
- 20. Szybkie mnożenie bardzo dużych liczb całkowitych
- 21. Dziwne zachowanie np.sqrt dla dużych liczb całkowitych
- 22. Restful API - obsługa dużych ilości danych
- 23. Obsługa dużych równoczesnych poświadczeń HTTP POST w aplikacji ASP.NET
- 24. Czy są jakieś solidne implementacje dużych liczb całkowitych w C?
- 25. Jak zdobyć n-ty root dużych liczb w C++?
- 26. Najszybsza możliwa obsługa XML w Delphi dla bardzo dużych dokumentów
- 27. W R lepiej używać liczb całkowitych64, liczbowych lub znakowych dla dużych liczb całkowitych?
- 28. Czy istnieje biblioteka .NET do formatowania dużych liczb jako tekst?
- 29. "interwał jest pusty", Lua math.random nie działa dla dużych liczb?
- 30. C++ Jaki typ zmiennej dla bardzo dużych liczb całkowitych?
Bardzo podobne: http://stackoverflow.com/questions/538551/handling-very-large-numbers-in-python –
W zależności od tego, co robisz z tymi liczbami, możesz rozważyć zapisanie ich jako log (numer). – mpen