Czy ktoś wie, jak Python zarządza wewnętrznie typami int i long?
- Czy dynamicznie wybiera właściwy typ?
- Jaki jest limit int?
- Używam Pythona 2.6, czy różni się od poprzednich wersji?
Jak mam zrozumieć poniższy kod?
>>> print type(65535)
<type 'int'>
>>> print type(65536*65536)
<type 'long'>
Aktualizacja:
>>> print type(0x7fffffff)
<type 'int'>
>>> print type(0x80000000)
<type 'long'>
realloc
wszystko w porządku. Ale nie jestem do końca pewien, więc odpowiedź zostawię komuś innemu.var = 666L
int
jest Clong
(domyślnie jest podpisany) ... zobacz<CPython 2.X source>/Include/intobject.h
: typedef struct {PyObject_HEAD długo ob_ival; } PyIntObject; W każdym razie Python 2.xint
dopuszcza liczby ujemne; Cunsigned
po prostu by sobie nie poradził.Odpowiedzi:
int
ilong
zostały „ujednolicone” kilka wersji wstecz . Wcześniej możliwe było przepełnienie int przez operacje matematyczne.3.x jeszcze bardziej to rozwinął, całkowicie eliminując long i mając tylko int.
sys.maxint
zawiera maksymalną wartość, jaką może przechowywać Python int.sys.getsizeof()
.sys.maxsize
zawiera maksymalny rozmiar w bajtach, jaki może mieć wartość int w Pythonie.sys.maxsize
.źródło
int
jest taki sam jak Python 2long
).Ten PEP powinien pomóc.
Najważniejsze jest to, że naprawdę nie powinieneś się tym martwić w wersjach Pythona> 2.4
źródło
Na moim komputerze:
Python używa liczb całkowitych (32-bitowe liczby całkowite ze znakiem, nie wiem, czy pod maską są to liczby całkowite C, czy nie) dla wartości pasujących do 32-bitowych, ale automatycznie przełącza się na długie (dowolnie dużą liczbę bitów - tj. Bignum) na wszystko większy. Domyślam się, że przyspiesza to działanie dla mniejszych wartości, unikając jednocześnie przepełnień z płynnym przejściem na bignum.
źródło
Ciekawy. Na moim 64-bitowym (i7 Ubuntu) pudełku:
Chyba zwiększa się do 64-bitowych intów na większej maszynie.
źródło
Python 2.7.9 automatycznie promuje liczby. W przypadku, gdy nie ma pewności co do użycia int () lub long ().
źródło
Python 2 automatycznie ustawi typ na podstawie rozmiaru wartości. Przewodnik po maksymalnych wartościach można znaleźć poniżej.
Wartość Max domyślnej wartości Int w Pythonie 2 to 65535, wszystko powyżej będzie długie
Na przykład:
W Pythonie 3 długi typ danych został usunięty, a wszystkie wartości całkowite są obsługiwane przez klasę Int. Domyślny rozmiar Int będzie zależał od architektury procesora.
Na przykład:
Wartości min / max każdego typu można znaleźć poniżej:
Jeśli rozmiar twojego Int przekracza limity wymienione powyżej, Python automatycznie zmieni jego typ i przydzieli więcej pamięci, aby obsłużyć ten wzrost wartości min / max. Podczas gdy w Pythonie 2 konwertowałoby się to na „długie”, teraz po prostu konwertuje się na następny rozmiar Int.
Przykład: jeśli używasz 32-bitowego systemu operacyjnego, maksymalna wartość Int będzie domyślnie wynosiła 2147483647. Jeśli przypisana zostanie wartość 2147483648 lub więcej, typ zostanie zmieniony na Int64.
Istnieją różne sposoby sprawdzenia rozmiaru int i alokacji pamięci. Uwaga: W Pythonie 3 użycie wbudowanej metody type () zawsze zwróci
<class 'int'>
bez względu na używany rozmiar Int.źródło
Począwszy od Pythona 3.x, zunifikowane biblioteki liczb całkowitych są jeszcze inteligentniejsze niż starsze wersje. Na moim (i7 Ubuntu) pudełku otrzymałem następujące informacje,
Szczegóły implementacji znajdują się w
Include/longintrepr.h, Objects/longobject.c and Modules/mathmodule.c
plikach. Ostatni plik jest modułem dynamicznym (skompilowanym do pliku so). Kod jest dobrze skomentowany.źródło
Aby przejść do wszystkich udzielonych tutaj odpowiedzi, zwłaszcza @James Lanes
wielkość typu całkowitego można wyrazić następującym wzorem:
całkowity zakres = (system 2 ^ bitowy)
dolna granica = - (system 2 ^ bitowy) * 0,5 górna granica = ((system 2 ^ bitowy) * 0,5) - 1
źródło
Zarządza nimi, bo
int
ilong
są rodzeństwem definicje klas. Mają odpowiednie metody na +, -, *, / itd., Które dadzą wyniki odpowiedniej klasy.Na przykład
W tym przypadku klasa
int
ma__mul__
metodę (tę, która implementuje *), która wlong
razie potrzeby tworzy wynik.źródło