2012-11-15 5 views
5

Có thể làm cho Python sử dụng ít hơn 12 byte cho một int không?Có thể lưu trữ int trong Python dưới 12 byte không?

>>> x=int() 
>>> x 
0 
>>> sys.getsizeof(x) 
12 

Tôi không phải là chuyên gia máy tính nhưng không quá 12 byte?

Int nhỏ nhất tôi muốn lưu trữ là 0, lớn nhất int 147097614, vì vậy tôi không nên thực sự cần nhiều hơn 4 byte.

(Có lẽ là cái gì tôi hiểu lầm ở đây là tôi không thể tìm thấy một câu trả lời bất cứ nơi nào trên mạng. Giữ ý nghĩ đó.)

+0

Xem [câu hỏi này] (http://stackoverflow.com/questions/10365624/sys-getsizeofint-returns-an-unreasonably-large-value). – lfk

+1

Cảm ơn. Thông tin thú vị ở đó, nhưng may mắn không phải là một bản sao, AFAICS. –

+2

Nếu bạn nghĩ rằng 12 byte là quá mức, hãy chờ cho đến khi bạn thử nó trên một kiến ​​trúc 64-bit, nơi nó mất 24 byte! – user4815162342

Trả lời

10

Trong python, int s là những vật thể giống như mọi thứ khác. Vì lý do đó, có thêm một chút phí trên chỉ liên quan đến thực tế là bạn đang sử dụng một đối tượng có một số siêu dữ liệu liên quan.

Nếu bạn định sử dụng của int và việc đặt chúng trong cấu trúc giống như mảng có ý nghĩa, bạn nên xem xét numpy. Các đối tượng Numpy ndarray sẽ có một ít chi phí liên quan đến chúng cho các phần siêu dữ liệu khác nhau mà các đối tượng mảng theo dõi, nhưng dữ liệu thực được lưu trữ dưới dạng kiểu dữ liệu bạn chỉ định (ví dụ: numpy.int32 cho số nguyên 4 byte.)

vì vậy, nếu bạn có:

import numpy as np 
a = np.zeros(5000,dtype=np.int32) 

mảng sẽ chỉ mất khoảng hơn 4*5000 = 20000 byte của bộ nhớ của bạn

+5

Câu trả lời hay; lưu ý rằng không nhất thiết phải phụ thuộc vào việc lưu trữ hiệu quả một lượng lớn các số nguyên. Mô-đun 'mảng' cung cấp một thay thế nhẹ (nhưng ít tính năng hơn) và có sẵn trong thư viện chuẩn. – user4815162342

7

Kích thước của một đối tượng số nguyên bao gồm các chi phí của việc duy trì thông tin đối tượng khác cùng với giá trị của nó . Thông tin bổ sung có thể bao gồm loại đối tượng, số tham chiếu và chi tiết triển khai cụ thể khác.

Nếu bạn lưu trữ nhiều số nguyên và muốn tối ưu hóa không gian đã sử dụng, hãy sử dụng array module, các mảng cụ thể được tạo bằng array.array('i').

5

Số nguyên trong python là các đối tượng và do đó được lưu trữ với chi phí bổ sung.

Bạn có thể đọc thêm thông tin về nó here

Kiểu số nguyên trong CPython được lưu trữ trong một cấu trúc như sau:

typedef struct { 
    PyObject_HEAD 
    long ob_ival; 
} PyIntObject; 

PyObject_HEAD là macro mở rộng ra thành một số tham khảo và một con trỏ đến đối tượng loại.

Vì vậy, bạn có thể thấy rằng:

  • long ob_ival - 4 byte cho một chặng đường dài.
  • Py_ssize_t ob_refcnt - Tôi giả định size_t ở đây là 4 byte.
  • PyTypeObject *ob_type - Là con trỏ, do đó 4 byte khác.

Tổng cộng 12 byte!