在C中,我们可以找到的大小int,char等我想知道如何获得物体的大小就像一个字符串,整数,等在Python.
我使用的XML文件包含指定值大小的大小字段.我必须解析这个XML并进行编码.当我想更改特定字段的值时,我将检查该值的大小字段.在这里,我想比较一下我输入的新值是否与XML中的值相同.我需要检查新值的大小.在字符串的情况下,我可以说它的长度.但是在int,float等的情况下我很困惑.
我正在编写Python代码来进行一些大数计算,并严重关注计算中使用的内存.
因此,我想计算每个变量的每一位.
例如,我有一个变量x,它是一个大数字,并且想要计算代表x的位数.
以下代码显然没用:
x=2**1000
len(x)
Run Code Online (Sandbox Code Playgroud)
因此,我转而使用以下代码:
x=2**1000
len(repr(x))
Run Code Online (Sandbox Code Playgroud)
变量x是(十进制)是:
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
但上面的代码返回303
上面的长long序列的长度为302,因此我认为303应仅与字符串长度相关.
所以,这是我原来的问题:
我怎么知道变量x的内存大小?
还有一件事; 在C/C++语言中,如果我定义
int z=1;
Run Code Online (Sandbox Code Playgroud)
这意味着为z分配了4个字节= 32位,并且这些位排列为00..001(31 0和1).
在这里,我的变量x是巨大的,我不知道它是否遵循相同的内存分配规则?
关于不同python数据类型的内存消耗有很多问题和讨论.然而,其中很少(如果有的话)来到一个非常具体的场景.当你想在内存中存储很多键值数据时,哪个数据结构更节省内存,dict还是一个元组列表?
一开始我认为dict比元组列表更强大,并且权力必须有一些代价,实际上一个空的dict占用的内存比空列表或元组更多(参见Python结构的内存大小),所以我以为使用[(key1, value1), (key2, value2), ...]会比内存更有效{key1: value1, key2: value2, ...}.
看起来我错了.只需启动以下代码段,然后查看操作系统报告的内存消耗情况.我正在使用Windows XP,以便任务管理器告诉我,一个大字典只吃"40MB Ram和40MB VIRTURAL Ram",但是一个元组列表吃掉了60MB Ram和60MB Virtual ram.
怎么会这样?
from sys import getsizeof as g
raw_input('ready, press ENTER')
i = 1000000
#p = [(x, x) for x in xrange(i)] # Will print 4,348,736 40,348,736
p = dict((x, x) for x in xrange(i)) # Will print 25,165,964 37,165,964
print g(p), g(p) + sum(g(x) for x in p)
raw_input("Check your process's memory consumption now, press ENTER …Run Code Online (Sandbox Code Playgroud) 我有一个非常大的列表假设我这样做(是的,我知道代码非常单一,但为了示例的缘故......):
n = (2**32)**2
for i in xrange(10**7)
li[i] = n
Run Code Online (Sandbox Code Playgroud)
工作良好.然而:
for i in xrange(10**7)
li[i] = i**2
Run Code Online (Sandbox Code Playgroud)
消耗大量内存.我不明白为什么 - 存储大数字需要更多位,而在Java中,第二个选项确实更节省内存...
有没有人对此有解释?
将数据存储在内存中所需的RAM与将相同数据存储在文件中所需的磁盘空间相比如何?或者没有广义相关性?
例如,假设我只有十亿个浮点值.以二进制形式存储,磁盘上有40亿字节或3.7GB(不包括标题等).然后说我把这些值读入Python的列表中......我应该要求多少RAM?
我有一个python类"foo",其中包含:
假设没有反向引用(循环),是否有一种简单的方法来衡量"foo"对象的总内存使用量?
基本上,我正在寻找"sys.getsizeof" 的递归版本
少数的,我碰到的工具包括:heapy,objgraph和GC,但我不认为任何人都能够胜任工作(我可以在此进行校正)
建议赞赏!
我想计算一个对象使用的内存.sys.getsizeof很好,但很浅(例如,在列表上调用,它不包括列表元素占用的内存).
我想写一个通用的"深层"版本sys.getsizeof.我理解"深层"的定义有些含糊不清; 我很满意后面copy.deepcopy的定义.
这是我的第一次尝试:
def get_deep_sizeof(x, level=0, processed=None):
if processed is None:
# we're here only if this function is called by client code, not recursively
processed = set()
processed.add(id(x))
mem = sys.getsizeof(x)
if isinstance(x, collections.Iterable) and not isinstance(x, str):
for xx in x:
if id(xx) in processed:
continue
mem += get_deep_sizeof(xx, level+1, processed)
if isinstance(x, dict):
mem += get_deep_sizeof(x[xx], level+1, processed)
return mem
Run Code Online (Sandbox Code Playgroud)
它遇到两个已知问题,以及未知数量未知的问题:
in,并硬编码字典的情况(包括值,而不仅仅是键).显然,这不适用于像字典这样的其他类.str(这是一个可迭代的,但没有任何其他对象的链接).如果有更多这样的对象,这将会破坏. …我想问一下在python dict中用作虚拟值的最便宜的数据类型(在内存消耗和保存/处理成本方面)是什么(只有dict的键对我很重要,值只是占位符)
举些例子 :
d1 = {1: None, 2: None, 3: None}
d2 = {1: -1, 2: -1, 3: -1}
d3 = {1: False, 2: False, 3: False}
Run Code Online (Sandbox Code Playgroud)
这里只有键(1,2,3)对我有用,值不是这样它们可以是任何值(仅用作占位符.我想知道的是我应该在这里使用的虚拟数据.现在我使用None,但不确定它是否是"最便宜的".
PS,我知道只存储键的最佳选择可能是使用Set而不是dict(带虚拟值).但是,我这样做的原因是因为我想使用SWIG在Python和C++之间交换数据.现在我已经想出如何使用SWIG将Python dict传递给C++作为std :: map,但是找不到任何关于如何将Python Set作为std :: set传递给C++的东西......
这里非常感谢帮助/指导!
我正在 Jupyter Notebook 上处理客户和购买数据。\n我在上面轻松地编写和执行代码,但突然间,它的速度变慢了,甚至需要很长时间才能执行一个简单的代码,例如print('A'). 最糟糕的是它没有向我显示任何错误,所以我完全不知道 Jupyter Notebook 或我的代码出了什么问题。
原始数据有点大。我合并了两个数据集,分别有 424,699 行和 22 列,总共有 4,308,392 行和 39 列。
\n\nThe versions:\nPython \xe2\x86\x92 3.7.4\nJupyter Notebook \xe2\x86\x92 6.0.0\nwindows 10 pro\nRun Code Online (Sandbox Code Playgroud)\n\n我只是想提高 Jupyter Notebook 的执行速度。
\n