Alguém sabe como Python gerencia internamente tipos int e long?
- Ele escolhe o tipo certo dinamicamente?
- Qual é o limite de um int?
- Estou usando o Python 2.6. É diferente das versões anteriores?
Como devo entender o código abaixo?
>>> print type(65535)
<type 'int'>
>>> print type(65536*65536)
<type 'long'>
Atualizar:
>>> print type(0x7fffffff)
<type 'int'>
>>> print type(0x80000000)
<type 'long'>
realloc
bem. Mas não tenho certeza, então vou deixar a resposta para outra pessoa.var = 666L
int
é um Clong
(o padrão é assinado) ... veja<CPython 2.X source>/Include/intobject.h
: typedef struct {PyObject_HEAD long ob_ival; } PyIntObject; Em qualquer caso, o Python 2.xint
permite números negativos; um Cunsigned
simplesmente não daria certo.Respostas:
int
elong
foram "unificados" algumas versões atrás . Antes disso, era possível estourar um int por meio de operações matemáticas.3.x avançou ainda mais, eliminando long completamente e tendo apenas int.
sys.maxint
contém o valor máximo que um int Python pode conter.sys.getsizeof()
.sys.maxsize
contém o tamanho máximo em bytes que um Python int pode ter.sys.maxsize
.fonte
int
é igual ao do Python 2long
).Este PEP deve ajudar.
O ponto principal é que você realmente não deveria ter que se preocupar com isso nas versões python> 2.4
fonte
Na minha máquina:
Python usa ints (inteiros assinados de 32 bits, não sei se são C ints por baixo do capô ou não) para valores que se encaixam em 32 bits, mas muda automaticamente para longs (número arbitrariamente grande de bits - ou seja, bignums) para qualquer coisa maior. Estou supondo que isso acelera as coisas para valores menores, evitando quaisquer transbordamentos com uma transição perfeita para bignums.
fonte
Interessante. Na minha caixa de 64 bits (i7 Ubuntu):
Acho que aumenta para ints de 64 bits em uma máquina maior.
fonte
O Python 2.7.9 promove números automaticamente. Para um caso em que não se tem certeza de usar int () ou long ().
fonte
Python 2 definirá automaticamente o tipo com base no tamanho do valor. Um guia de valores máximos pode ser encontrado abaixo.
O valor máximo do Int padrão em Python 2 é 65535, qualquer coisa acima disso será um longo
Por exemplo:
No Python 3, o tipo de dados longo foi removido e todos os valores inteiros são tratados pela classe Int. O tamanho padrão do Int dependerá da arquitetura da CPU.
Por exemplo:
Os valores mín. / Máx. De cada tipo podem ser encontrados abaixo:
Se o tamanho do seu Int exceder os limites mencionados acima, o python mudará automaticamente o seu tipo e alocará mais memória para lidar com este aumento nos valores mínimo / máximo. Enquanto em Python 2, ele seria convertido em 'longo', agora apenas se converte no próximo tamanho de Int.
Exemplo: se você estiver usando um sistema operacional de 32 bits, o valor máximo de um Int será 2147483647 por padrão. Se um valor de 2147483648 ou mais for atribuído, o tipo será alterado para Int64.
Existem diferentes maneiras de verificar o tamanho do int e sua alocação de memória. Nota: No Python 3, o uso do método interno type () sempre retornará,
<class 'int'>
não importa o tamanho Int que você esteja usando.fonte
No python 3.x, as bibliotecas de inteiros unificados são ainda mais inteligentes do que as versões anteriores. Na minha caixa (i7 Ubuntu), eu tenho o seguinte,
Para detalhes de implementação, consulte os
Include/longintrepr.h, Objects/longobject.c and Modules/mathmodule.c
arquivos. O último arquivo é um módulo dinâmico (compilado em um arquivo so). O código é bem comentado a seguir.fonte
Só para continuar com todas as respostas que foram dadas aqui, especialmente @James Lanes
o tamanho do tipo inteiro pode ser expresso por esta fórmula:
intervalo total = (sistema de 2 ^ bits)
limite inferior = - (sistema de 2 ^ bits) * 0,5 limite superior = ((sistema de 2 ^ bits) * 0,5) - 1
fonte
Ele gerencia-los, porque
int
elong
são irmãos definições de classe. Eles têm métodos apropriados para +, -, *, /, etc., que produzirão resultados da classe apropriada.Por exemplo
Neste caso, a classe
int
possui um__mul__
método (aquele que implementa *) que cria umlong
resultado quando necessário.fonte