Czym jest sys.maxint w Pythonie 3?


162

Próbowałem dowiedzieć się, jak przedstawić maksymalną liczbę całkowitą i czytałem, aby użyć "sys.maxint". Jednak w Pythonie 3, gdy go nazywam, otrzymuję:

AttributeError: module 'object' has no attribute 'maxint'

Możliwe duplikaty wartości maksymalnych i minimalnych dla ints
Georgy

Odpowiedzi:


172

Stała sys.maxint została usunięta, ponieważ nie ma już ograniczenia wartości liczb całkowitych. Jednak sys.maxsize może być używany jako liczba całkowita większa niż jakakolwiek praktyczna lista lub indeks ciągu. Jest zgodny z „naturalnym” rozmiarem całkowitym implementacji i zazwyczaj jest taki sam, jak sys.maxint w poprzednich wersjach na tej samej platformie (przy założeniu tych samych opcji kompilacji).

http://docs.python.org/3.1/whatsnew/3.0.html#integers


79

Jak podkreślali inni, Python 3 intnie ma maksymalnego rozmiaru, ale jeśli potrzebujesz czegoś, co gwarantuje, że będzie wyższa niż jakakolwiek inna intwartość, możesz użyć wartości float dla Infinity, którą możesz uzyskać float("inf").


Działa również ze starszym Pythonem (2.7) - jest to poprawna odpowiedź, gdy trzeba zwrócić liczbę wyższą niż wszystkie możliwe wartości rzeczywiste (np. W celu sortowania listy przez porównanie obiektów)
Aaron D

3
Jedną z wad tego podejścia jest to, że float inf może zrujnować typ danych tablic, jeśli próbujesz zastosować kompilację jit za pomocą numba, Cython lub podobnych. Możesz potrzebować listy Pythona wszystkich typów liczb całkowitych, aby kompilator jit mógł na przykład automatycznie przekonwertować ją na odpowiedni typ c. Jest to szczególnie ważne w przypadku klasycznych algorytmów, w których można zastosować narzędzia jit, aby uczynić je znacznie szybszymi niż czysta implementacja Pythona, ale nadal chcesz napisać implementację w czystym Pythonie dla wygody, testowania, powrotu, jeśli kompilator jit nie jest zainstalowany w wdrożonym środowisku itp.
ely

24

Liczba int w Pythonie 3 nie ma wartości maksymalnej.

Jeśli twoim celem jest określenie maksymalnego rozmiaru int w C po skompilowaniu w taki sam sposób jak Python, możesz użyć modułu struct, aby dowiedzieć się:

>>> import struct
>>> platform_c_maxint = 2 ** (struct.Struct('i').size * 8 - 1) - 1

Jeśli jesteś ciekawy wewnętrznych szczegółów implementacji obiektów int w Pythonie 3, spójrz na szczegóły sys.int_infodotyczące liczby bitów na cyfrę i rozmiaru cyfry. Żaden normalny program nie powinien o to dbać.


18

Jeśli szukasz liczby większej niż wszystkie inne:

Metoda 1:

float('inf')

Metoda 2:

import sys
max = sys.maxsize

Jeśli szukasz liczby mniejszej niż wszystkie inne:

Metoda 1:

float('-inf')

Metoda 2:

import sys
min = -sys.maxsize - 1

Metoda 1 działa zarówno w Python2, jak i Python3. Metoda 2 działa w Python3. Nie próbowałem metody 2 w Python2.


3

Python 3.0 nie ma już sys.maxint, ponieważ wartości int w Pythonie 3 mają dowolną długość. Zamiast sys.maxint ma sys.maxsize; maksymalny rozmiar dodatniego rozmiaru size_t aka Py_ssize_t.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.