Python打印长度或一次获取多个变量的大小

Python打印长度或一次获取多个变量的大小,python,class,python-2.7,printing,size,Python,Class,Python 2.7,Printing,Size,在Python中,如果我print以逗号分隔的不同数据类型,它们都将根据它们的\uuuu str\uuuu(或者可能是\uuu repr\uuuu)方法进行操作,并为我打印出一个漂亮的字符串 我有一堆变量,比如下面的data1,data2…,我很想得到它们的大致大小。我知道: 并非所有变量都有一个有用的sys.getsizeof(我想知道存储的大小,而不是容器的大小。)-多亏了Martijn Pieters 对于我来说,每个打印变量的长度是一个足够好的大小估计 我希望避免单独处理不同的数据类

在Python中,如果我
print
以逗号分隔的不同数据类型,它们都将根据它们的
\uuuu str\uuuu
(或者可能是
\uuu repr\uuuu
)方法进行操作,并为我打印出一个漂亮的字符串

我有一堆变量,比如下面的
data1,data2…
,我很想得到它们的大致大小。我知道:

  • 并非所有变量都有一个有用的
    sys.getsizeof
    (我想知道存储的大小,而不是容器的大小。)-多亏了Martijn Pieters

  • 对于我来说,每个打印变量的长度是一个足够好的大小估计

我希望避免单独处理不同的数据类型。有没有办法利用
print
这样的函数来获取数据的总长度?我发现像这样的东西不太可能还没有内置到Python中

>>> obj.data1 = [1, 2, 3, 4, 5]
>>> obj.data2 = {'a': 1, 'b':2, 'c':3}
>>> obj.data3 = u'have you seen my crossbow?'
>>> obj.data4 = 'trapped on the surface of a sphere'
>>> obj.data5 = 42
>>> obj.data6 = <fake a.b instance at 0x88888>
>>> print obj.data1, obj.data2, obj.data3, obj.data4, obj.data5, obj.data6
[1, 2, 3, 4, 5] {'a': 1, 'c': 3, 'b': 2} have you seen my crossbow? trapped on the surface of a sphere 42 meh
我知道你们中的大多数人都可以写这样的东西,但我主要是问Python是否有任何内置的方法来完成它。一个很好的解决方案将向我展示一种方法,可以
返回
在Python2.7中打印的
字符串。(类似于PHP中的
print\r
,否则我会觉得它完全不如Python。)我计划通过编程方式使用许多具有预填充变量的对象来实现这一点,因此不会写入临时文件或类似的内容

谢谢


作为旁注,这个问题源于需要计算由未知数据构造的类中变量的近似总大小。如果您有办法获得类中不可调用项的总大小(老实说,总大小也会起作用),那么该解决方案会更好。我没有把这作为我的主要问题,因为在我看来Python不支持这样的东西。如果有,万岁

首先,
sys.getsizeof()
不是用来确定打印大小的方法。python对象内存占用对于将python对象表示为字符串所需的字符数来说是一个很差的指标

您正在寻找
len()
。使用一个简单的生成器表达式加上
sum()
可以得到一个总数:

def printlen(*args):
    if not args:
        return 0
    return sum(len(str(arg)) for arg in args) + len(args) - 1
表达式之间的逗号告诉
print
打印一个空格,因此
print
将写入
stdout
的总长度是所有字符串表示的总长度加上元素之间的空格

我假设您也不想包括换行
print
写入

演示:


首先,
sys.getsizeof()
不是用来确定打印大小的方法。python对象内存占用对于将python对象表示为字符串所需的字符数来说是一个很差的指标

您正在寻找
len()
。使用一个简单的生成器表达式加上
sum()
可以得到一个总数:

def printlen(*args):
    if not args:
        return 0
    return sum(len(str(arg)) for arg in args) + len(args) - 1
表达式之间的逗号告诉
print
打印一个空格,因此
print
将写入
stdout
的总长度是所有字符串表示的总长度加上元素之间的空格

我假设您也不想包括换行
print
写入

演示:


现在应该可以正确地执行此操作:

def printlen(*args):
    return sum(map(len, map(str, args)))
对于不支持
str(obj)
功能的对象。您可以用自制函数或lambda替换
str

def printlen(*args):
    return sum(map(len, map(lambda x: str(x) if hasattr(x, '__str__') else '', args)))

现在应该可以正确地执行此操作:

def printlen(*args):
    return sum(map(len, map(str, args)))
对于不支持
str(obj)
功能的对象。您可以用自制函数或lambda替换
str

def printlen(*args):
    return sum(map(len, map(lambda x: str(x) if hasattr(x, '__str__') else '', args)))

如果需要长度,可以使用以下选项:

printlen = lambda *x: print(sum(len(str(i)) for i in x))
用法:

printlen(obj1, obj2, ..)

如果需要长度,可以使用以下选项:

printlen = lambda *x: print(sum(len(str(i)) for i in x))
用法:

printlen(obj1, obj2, ..)

如果你有一个对象结构,你想知道它需要多少来存储它,你也可以
pickle
/
cpickle
对象并使用该数字作为度量,还可以将数据存储到数据库中。

如果你有一个对象结构,你想知道它需要多少来存储它,您还可以
pickle
/
cpickle
对象,并使用该数字作为度量,还可以将数据存储到数据库中。

“一个很好的解决方案将向我展示一种返回Python 2.7中打印的字符串的方法。”

这大致就是
print
打印的内容(可能是多余的空格,缺少最后的换行符):

如果您遇到大量无法使用
str
的对象,请改用
safe\u str

  def safer_str(obj):
      return str(obj) if hasattr(obj,"__str__") else repr(obj)
“一个很好的解决方案将向我展示一种返回Python 2.7中打印的字符串的方法。”

这大致就是
print
打印的内容(可能是多余的空格,缺少最后的换行符):

如果您遇到大量无法使用
str
的对象,请改用
safe\u str

  def safer_str(obj):
      return str(obj) if hasattr(obj,"__str__") else repr(obj)

探查器会更有用吗?@doctorlove可能会,但这实际上只是一个中间步骤,看看我的平均对象是否足够小,我能负担得起将它们全部移动到数据库中。如果有一个类方法能给我提供大致的大小,那就太好了。探查器会更有用吗?@doctorlove,但这实际上只是一个中间步骤,看看我的平均对象是否足够小,我能负担得起将它们全部移动到数据库中。如果有一个类方法能给我一个大致的大小,那就太好了。我知道sys.getsizeof并不代表所需的字符数。如果证明可行,我计划将这些数据移动到数据库中,因此我只想以某种可测量的方式知道许多对象的大致大小,无论是打印长度还是内存占用。空间将是可忽略的。(我假设Python的足迹是合理的)。使用的问题