Che cos'è sys.maxint in Python 3?


162

Ho cercato di scoprire come rappresentare un numero intero massimo e ho letto per usare "sys.maxint". Tuttavia, in Python 3 quando lo chiamo ottengo:

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

Risposte:


172

La costante sys.maxint è stata rimossa, poiché non esiste più un limite al valore di numeri interi. Tuttavia, sys.maxsize può essere utilizzato come numero intero più grande di qualsiasi elenco pratico o indice di stringa. È conforme alla dimensione intera "naturale" dell'implementazione ed è in genere uguale a sys.maxint nelle versioni precedenti sulla stessa piattaforma (presupponendo le stesse opzioni di generazione).

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


79

Come sottolineato da altri, Python 3 intnon ha una dimensione massima, ma se hai solo bisogno di qualcosa che è garantito essere superiore a qualsiasi altro intvalore, puoi usare il valore float per Infinity, che puoi ottenere float("inf").


Funziona anche con Python legacy (2.7): questa è la risposta corretta quando è necessario restituire un numero superiore a tutti i possibili valori reali (ad esempio per l'ordinamento degli elenchi confrontando gli oggetti)
Aaron D

3
Un aspetto negativo di questo approccio è che float inf può rovinare il tipo di dati degli array se si sta tentando di applicare la compilazione jit con numba o Cython o simili. Potrebbe essere necessario un elenco Python di tutti i tipi interi in modo che un compilatore jit possa convertirlo automaticamente nel tipo c appropriato, ad esempio. Ciò è particolarmente critico per gli algoritmi classici in cui è possibile applicare gli strumenti jit per renderli molto più veloci di un'implementazione Python pura, ma ancora voler scrivere l'implementazione in Python puro per comodità, test, fallback se il compilatore jit non è installato in un ambiente distribuito , ecc.
ely,

24

Python 3 ints non hanno un massimo.

Se il tuo scopo è determinare la dimensione massima di un int in C quando compilato nello stesso modo in cui era Python, puoi usare il modulo struct per scoprire:

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

Se sei curioso di sapere i dettagli dell'implementazione interna degli oggetti int di Python 3, cerca i sys.int_infobit per cifra e i dettagli delle dimensioni delle cifre. Nessun programma normale dovrebbe interessarsene.


18

Se stai cercando un numero più grande di tutti gli altri:

Metodo 1:

float('inf')

Metodo 2:

import sys
max = sys.maxsize

Se stai cercando un numero più piccolo di tutti gli altri:

Metodo 1:

float('-inf')

Metodo 2:

import sys
min = -sys.maxsize - 1

Il metodo 1 funziona sia in Python2 che in Python3. Il metodo 2 funziona in Python3. Non ho provato il metodo 2 in Python2.


3

Python 3.0 non ha più sys.maxint poiché gli ints di Python 3 sono di lunghezza arbitraria. Invece di sys.maxint ha sys.maxsize; la dimensione massima di una dimensione positiva size_t aka Py_ssize_t.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.