Python int ve long'u nasıl yönetir?


118

Python'un dahili ve uzun türleri nasıl yönettiğini bilen var mı?

  • Dinamik olarak doğru türü seçiyor mu?
  • İnt için sınır nedir?
  • Python 2.6 kullanıyorum, önceki sürümlerden farklı mı?

Aşağıdaki kodu nasıl anlamalıyım?

>>> print type(65535)
<type 'int'>
>>> print type(65536*65536)
<type 'long'>

Güncelleme:

>>> print type(0x7fffffff)
<type 'int'>
>>> print type(0x80000000)
<type 'long'>

CPython'da stdc türlerini anında altta eşlemiyorlar mı?
Aiden Bell

Evet, öyle olduğunu düşünüyorum. Ayrıca her şeyin yığına tahsis edildiğinden şüpheleniyorum, bu yüzden bir sayı daha fazla hassasiyete ihtiyaç duyduğunda realloc, hepsi tamam. Ama tam olarak emin değilim, bu yüzden cevabı başka birine bırakacağım.
zneak

2
Ayrıca var = 666L
python'u

8
@Ignacio: YANLIŞ CPython intbir C'dir long(varsayılan işaretlidir) ... bkz <CPython 2.X source>/Include/intobject.h: typedef struct {PyObject_HEAD long ob_ival; } PyIntObject; Her durumda Python 2.x intnegatif sayılara izin verir; bir C unsignedbaşa çıkamaz.
John Machin

PEP 237, Python'un tüm bunları görünüşte aynı hale getirmenin nasıl amaçlandığını tartışıyor.
Carel

Yanıtlar:


124

intve birkaç sürüm gerilong "birleştirildi" . Bundan önce matematik işlemleriyle bir int aşmak mümkündü.

3.x, long'u tamamen ortadan kaldırarak ve yalnızca int'e sahip olarak bunu daha da geliştirmiştir.

  • Python 2 : sys.maxintBir Python int'in tutabileceği maksimum değeri içerir.
    • 64 bit Python 2.7'de boyut 24 bayttır. İle kontrol edin sys.getsizeof().
  • Python 3 : sys.maxsizebir Python int'in olabileceği maksimum boyutu bayt cinsinden içerir.
    • Bu, 32 bitte gigabayt ve 64 bitte eksabayt olacaktır.
    • Böyle büyük bir int, 8'in kuvvetine benzer bir değere sahip olacaktır sys.maxsize.

30
Ancak Python3, daha çok 2.x'in 'long' gibi davranmasına rağmen bu türü 'int' olarak adlandırır.

3
Ted'in yorumu: Aşağıda belirtildiği gibi, maxint'den daha büyük bir şeyi int'e çevirmenin yine de uzun bir >>> tipi (int (sys.maxint + 1)) <type 'long'> ile
sonuçlanacağına dikkat edin

2
sys.maxint size en büyük 64bit tamsayıyı verecektir (benim 64bit makinemde) a Long, 64 bitten çok daha büyük olabilir, sadece "sys.maxint << 1000000" i deneyin
fccoelho

4
Python3'te sys.maxsize
pylover

3
sys.maxsize'nin tamsayılarla ilgisi yoktur. Python 3'ün sys.maxint'i, bir tam sayı için maksimum boyut olmadığından kaldırıldı (Python 3'ler, Python 2'ler ile intaynıdır long).
asmeurer

19

Bu PEP yardımcı olmalıdır.

Alt satırda, python> 2.4 sürümlerinde gerçekten endişelenmenize gerek yok.


15
C'de int'e uymayan bir şeyle (yani uzun) bir int işlevi çağırmanız gerekiyorsa, bunun için endişelenmelisiniz. Hiçbir miktarda long-> int yardımcı olmaz. Kısa süre önce başıma geldi.
Macke

1
@Macke: Bu yorum beni kurtardı, int'in hile yapacağını varsaydım ve neden hala bir Jython istisnası aldığımı merak ediyordum.
Ted

@Macke Kesinlikle doğru. Şu anda çalıştığım şirkette Python'da yazılmış ve Tkinter girdileri aracılığıyla kullanıcı girdisi alan ve dönüştürülen değerleri TCP / IP yoluyla gömülü bir sistemi taklit eden bir istemciye (C / C ++ ile yazılmış) gönderen bir Simülatörümüz var. Python Tabanlı Girişinize 100000000000000000000000 eklediğinizde ne olacağını bir düşünün ...: P
rbaleksandar

@Mackie, eğer gerçekten PEP'i okumaya zahmet ettiyseniz, açıkça şunu söyler: C API değişmeden kalır; C kodunun yine de kısa ve uzun girişler arasındaki farkın farkında olması gerekecektir. (Python 3.0 C API muhtemelen tamamen uyumsuz olacaktır.) PyArg_Parse * () API'leri, C int veya long argümanı alan fonksiyonların kazanması için, C ints veya longs ile gösterilebilen aralık içinde oldukları sürece, long int'leri zaten kabul etmektedir. Python uzunlarla uğraşma konusunda endişelenmenize gerek yok.
cowbert

4

Makinemde:

>>> print type(1<<30)
<type 'int'>
>>> print type(1<<31)
<type 'long'>
>>> print type(0x7FFFFFFF)
<type 'int'>
>>> print type(0x7FFFFFFF+1)
<type 'long'>

Python, 32 bit'e uyan değerler için ints (32 bit işaretli tamsayılar, bunların kaputun altındaki Cintler olup olmadıklarını bilmiyorum) kullanır, ancak herhangi bir şey için otomatik olarak uzunlara (keyfi olarak çok sayıda bit - yani bignum) geçer. daha büyük. Sanırım bu, daha küçük değerler için işleri hızlandırırken, bignumlara sorunsuz bir geçişle herhangi bir taşmayı önler.


4

İlginç. 64 bit (i7 Ubuntu) kutumda:

>>> print type(0x7FFFFFFF)
<type 'int'>
>>> print type(0x7FFFFFFF+1)
<type 'int'>

Daha büyük bir makinede 64 bitlik girişlere kadar çıktığını tahmin edin.


2
Python, makine için mevcut olan daha büyük tamsayı türünü kullanır. SO genellikle 32-bit makinelerde int 32bit boyuta sahipken 64-bit makinelerde 64 bit boyuta sahip olacaktır. Ancak 64 bitlik tam sayıları tanımlayan 32 bit mimariler olabilir, bu durumda python 64 bit tamsayıyı kullanır.
Bakuriu

4

Python 2.7.9 otomatik sayıları yükseltir. İnt () veya long () kullanmaktan emin olmadığınız bir durum için.

>>> a = int("123")
>>> type(a)
<type 'int'>
>>> a = int("111111111111111111111111111111111111111111111111111")
>>> type(a)
<type 'long'>

4

Python 2, türü değerin boyutuna göre otomatik olarak ayarlayacaktır. Maksimum değerlerin bir kılavuzu aşağıda bulunabilir.

Python 2'deki varsayılan Int'in Maksimum değeri 65535'tir, bunun üzerindeki herhangi bir şey uzun olacaktır

Örneğin:

>> print type(65535)
<type 'int'>
>>> print type(65536*65536)
<type 'long'>

Python 3'te uzun veri türü kaldırılmıştır ve tüm tam sayı değerleri Int sınıfı tarafından işlenir. Int'in varsayılan boyutu CPU mimarinize bağlı olacaktır.

Örneğin:

  • 32 bit sistemler tamsayılar için varsayılan veri türü 'Int32' olacaktır
  • 64 bit sistemler tamsayılar için varsayılan veri türü 'Int64' olacaktır

Her türün min / maks değerleri aşağıda bulunabilir:

  • Int8: [-128.127]
  • Int16: [-32768,32767]
  • Int32: [-2147483648,2147483647]
  • Int64: [-9223372036854775808,9223372036854775807]
  • Int128: [-170141183460469231731687303715884105728,170141183460469231731687303715884105727]
  • UInt8: [0,255]
  • UInt16: [0,65535]
  • UInt32: [0,4294967295]
  • UInt64: [0,18446744073709551615]
  • UInt128: [0,340282366920938463463374607431768211455]

Int'inizin boyutu yukarıda belirtilen sınırları aşarsa, python otomatik olarak türünü değiştirecek ve min / maks değerlerindeki bu artışı işlemek için daha fazla bellek ayıracaktır. Python 2'de, 'uzun'a dönüştüğü yerde, şimdi sadece bir sonraki Int boyutuna dönüşüyor.

Örnek: 32 bit işletim sistemi kullanıyorsanız, bir Int için maksimum değeriniz varsayılan olarak 2147483647 olacaktır. 2147483648 veya daha fazla bir değer atanırsa, tür Int64 olarak değiştirilir.

İnt boyutunu ve bellek ayırmasını kontrol etmenin farklı yolları vardır. Not: Python 3'te yerleşik type () yöntemini kullanmak, <class 'int'>hangi boyutta Int kullanıyor olursanız olun her zaman döndürür .


1

Python 3.x'ten itibaren, birleşik tamsayı kitaplıkları eski sürümlerden daha akıllıdır. (İ7 Ubuntu) kutumda aşağıdakiler var,

>>> type(math.factorial(30))
<class 'int'>

Uygulama ayrıntıları için Include/longintrepr.h, Objects/longobject.c and Modules/mathmodule.cdosyalara bakın . Son dosya dinamik bir modüldür (so dosyasında derlenir). Kod, takip etmek için iyi yorumlanmıştır.


1

Sadece burada verilen tüm cevaplara devam etmek için, özellikle @ James Lanes

tamsayı türünün boyutu şu formülle ifade edilebilir:

toplam aralık = (2 ^ bit sistemi)

alt sınır = - (2 ^ bit sistemi) * 0,5 üst sınır = ((2 ^ bit sistemi) * 0,5) - 1


0

Onları yönetir çünkü intve longkardeş sınıf tanımlarıdır. Uygun sınıfın sonuçlarını üretecek +, -, *, / vb. İçin uygun yöntemlere sahiptirler.

Örneğin

>>> a=1<<30
>>> type(a)
<type 'int'>
>>> b=a*2
>>> type(b)
<type 'long'>

Bu durumda, sınıf intbir sahip __mul__bir oluşturur yöntemi (uygular * o bir) longgerektiğinde sonucu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.