Python常见面试题010. Python的int占多大内存?

python,常见,面试题,int,内存 · 浏览次数 : 80

小编点评

**答案:** `a.__sizeof__` 返回 `24`,因为 `int` 类型在 Python 中是动态的,每 2**30 个字节增加 4 个字节的边界。 `b.__sizeof__` 返回 `28`,因为 `list` 类型也是动态的,每 2**30 个字节增加 8 个字节的边界。 `c.__sizeof__` 返回 `28`,因为 `set` 类型也是动态的,每 2**30 个字节增加 8 个字节的边界。 `d.__sizeof__` 返回 `28`,因为 `tuple` 类型也是动态的,每 2**30 个字节增加 8 个字节的边界。 `e.__sizeof__` 返回 `32`,因为 `dict` 类型也是动态的,每 2**30 个字节增加 8 个字节的边界。

正文

010. Python的int占多大内存?

示例代码

import sys
a = 0
print(a.__sizeof__())  # 24
print(sys.getsizeof(a)) # 24
  • 所以答案是24?并不是!看下面
import sys
b = 1
print(b.__sizeof__()) # 28
print(sys.getsizeof(b)) # 28
  • 变了
  • 难道都会变?
import sys
c = 3
print(c.__sizeof__()) # 28
print(sys.getsizeof(c))   # 28
  • 不是你想的那样的!
  • 但的确是动态的
import sys
d = 1073741823
e = 1073741824
print(d.__sizeof__()) # 28
print(sys.getsizeof(e)) # 32
  • 有点规律了,1073741824是什么鬼?它是2**30
  • 实际上,python的int类型就是动态的,每2**30增加4个字节
  • 那下一个边界是?2**60!
print(sys.getsizeof(2**60))  # 36
  • 那其他类型呢?可以参考附录

sizeof()

  • 返回内存中的大小,单位字节
 |  __sizeof__(self, /)
 |      Returns size in memory, in bytes.

getsizeof()

  • 这是sys模块的一个方法
  • 在pycharm中你只能看到如下内容,不过大致也是返回对象的大小,单位是字节
def getsizeof(p_object, default): # real signature unknown; restored from __doc__
    """
    getsizeof(object, default) -> int
    
    Return the size of object in bytes.
    """
    return 0
  • 2个貌似一样

  • 其实不然

    b = []
    print(b.__sizeof__())  # 40
    print(sys.getsizeof(b))   # 56 不一样(我在jupyter中执行的结果) # 如果你在pycharm中执行可能此处是 64
    
import sys
l = []
w =[1, 2]
x =[4, 5, 7, 9]
y =[2, 8, 6, 56, 45, 89, 88]

print('sizeof:%d,getsize:%d' %(l.__sizeof__(),sys.getsizeof(l))) 
print('sizeof:%d,getsize:%d' %(w.__sizeof__(),sys.getsizeof(w)))
print('sizeof:%d,getsize:%d' %(x.__sizeof__(),sys.getsizeof(x)))

# sizeof:40,getsize:64 # 此处就是在pycharm中执行的
# sizeof:56,getsize:80
# sizeof:72,getsize:96
  • getsizeof() 方法调用__sizeof__方法,但同时会附带一些额外的GC操作(arbage collector overhead). 因此前者的大小比后者要大一些

  • 列表初始化的时候是40,每加一个元素是8个字节

  • 代码大了之后,内存管理就显得非常重要了,现在仅作了解

附录

https://stackoverflow.com/questions/449560/how-do-i-determine-the-size-of-an-object-in-python

  • 对于其他类型,有人做了一些测试

  • 基于 64-bit Python 3.6,使用Anaconda

    Empty
    Bytes  type        scaling notes
    28     int         +4 bytes about every 30 powers of 2
    37     bytes       +1 byte per additional byte
    49     str         +1-4 per additional character (depending on max width)
    48     tuple       +8 per additional item
    64     list        +8 for each additional
    224    set         5th increases to 736; 21nd, 2272; 85th, 8416; 341, 32992
    240    dict        6th increases to 368; 22nd, 1184; 43rd, 2280; 86th, 4704; 171st, 9320
    136    func def    does not include default args and other attrs
    1056   class def   no slots 
    56     class inst  has a __dict__ attr, same scaling as dict above
    888    class def   with slots
    16     __slots__   seems to store in mutable tuple-like structure
                       first slot grows to 48, and so on.
    

与Python常见面试题010. Python的int占多大内存? 相似的内容:

Python常见面试题010. Python的int占多大内存?

010. Python的int占多大内存? 示例代码 import sys a = 0 print(a.__sizeof__()) # 24 print(sys.getsizeof(a)) # 24 所以答案是24?并不是!看下面 import sys b = 1 print(b.__sizeof_

Python常见面试题001-005,涉及深浅拷贝、MRO、函数可变参数、作用域、is和==的区别等

Python常见面试题001-005 参考资料 https://github.com/taizilongxu/interview_python https://github.com/hantmac/Python-Interview-Customs-Collection https://github.

Python常见面试题006 类方法、类实例方法、静态方法有何区别?

006. Python中类方法、类实例方法、静态方法有何区别? 全部放一个里面篇幅过大了,就拆分成1个个发布 示例代码 class Human: def __init__(self, name): self.name = name def say(self): print(f'我的名字是{self.

Python常见面试题007. 谈谈Python中__init__和__new__的区别

007. 谈谈Python中__init__和__new__的区别 python中关于dunder method双下方法,或magic method魔术方法的描述多在 https://docs.python.org/zh-cn/3.9/reference/datamodel.html#special

Python常见面试题008. 谈谈python中的解包

008. 谈谈python中的解包 这是个简单的知识点,但有的学员并不理解 unpacking解包 解,对应的是*或者**,也有自动解包之说 包对应的可迭代对象 自动解包 赋值的demo a,b = [1,2] print(a) # 1 print(b) # 2 将容器里面的元素逐个取出来分别赋值

Python常见面试题011. 如何在Python中动态创建类?

011. 如何在Python中动态创建类? 说在前面 答案是type 你印象中的type是用来查看对象的类型的 li = [] type(li) # 得到list 对自定义的类是这样的 class Person: pass wuxianfeng = Person() type(wuxianfeng)

Python常见面试题009. 元组和列表有什么区别

009. 元组和列表有什么区别 这个题是简单的,但要拿满分或者说高分不容易 相同点 | 共性 | 说明 | | | | | 可以存放任意元素 | 一般都放同类型 | | 支持索引访问 | 甚至是负数 | | 支持切片操作 | | | 逗号分隔元素 | | | 都是有序集合(容器) | | | 可以随

Python常见面试题012. 可迭代对象和迭代器有啥区别?

012. 可迭代对象和迭代器有啥区别? 2者不是一回事(废话) 比如 from collections.abc import Iterable,Iterator print(isinstance([1, 2], Iterable)) # True 列表是可迭代对象 print(isinstance(

Python常见面试题013.请说出下面的代码返回结果是什么?

013.请说出下面的代码返回结果是什么? *的坑;简单题 参考:https://docs.python.org/zh-cn/3.9/library/stdtypes.html#typesseq 示例代码 lists = [[]] * 3 lists[0].append(1) 请问lists此时是什么

Python常见面试题014.请说出下面的代码返回结果是什么?

示例代码 def fun(a, b, c, d): nums = [] for num in range(a, b): nums.append(lambda: num ** c) return nums[d]() print(fun(1, 5, 2, 0)) print(fun(1, 5, 2, 1