2013-08-13 3 views
0

В Python, если я print разных типов данных, разделенных запятыми, все они будут действовать в соответствии со способами __str__ (или, возможно, __repr__) и распечатать красивую симпатичную строку для меня.Длина печати Python ИЛИ получение размера нескольких переменных сразу

У меня есть куча переменных, таких как data1, data2..., и я хотел бы получить их общий приблизительный размер. Я знаю, что:

  • не все переменные имеют полезный sys.getsizeof (я хочу знать размер сохраняется, а не размер контейнера.) -Благодаря Martijn Питерс

  • длина каждая из печатных переменных является достаточно хорошей оценкой размера для моих целей.

Я хотел бы избежать использования разных типов данных по отдельности. Есть ли способ использовать функцию, например 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 

Я ищу что-то вроде:

printlen(obj.data1, obj.data2, obj.data3, obj.data4, obj.data5, obj.data6) 
109 

Я знаю, что большинство из вас могли бы написать что-то вроде этого, но я в основном с просьбой, если Python имеет какой-либо встроенный способ сделать это , Отличное решение показало бы мне способ, чтобы return строка, которую print печатает в Python 2.7. (Что-то вроде print_r в PHP, которое я иначе чувствую, полностью уступает Python.) Я планирую сделать это программно со многими объектами, у которых есть предварительно заполненные переменные, поэтому не нужно писать во временный файл или что-то в этом роде.

Спасибо!

В качестве побочного примечания этот вопрос возник из-за необходимости рассчитать приблизительный общий размер переменных в классе, который строится из неизвестных данных. Если у вас есть способ получить общий размер не подлежащих вызову элементов в классе (честно говоря, общий размер тоже будет работать), это решение будет еще лучше. Я не сделал этого основного вопроса, потому что мне кажется, что Python не поддерживает такую ​​вещь. Если да, то ура!

+0

Может ли быть более полезным профилировщик? – doctorlove

+0

@doctorlove Потенциально, но это действительно просто промежуточный шаг, чтобы увидеть, достаточно ли моего среднего объекта, чтобы я мог переместить все их в базу данных. Было бы неплохо иметь метод класса, который просто дал мне приблизительный размер. – vroomfondel

ответ

1

«Отличное решение показало бы мне способ вернуть строку, которая печатает отпечатки в Python 2.7».

Это примерно то, что print отпечатки (возможно, дополнительные пробелы, недостающие окончательного перевода строки):

def print_r(*args): 
     return " ".join((str(arg) for arg in args)) 

Если вы бежите в к большому количеству объектов, которые не являются str -able использование safer_str вместо:

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

Прежде всего, sys.getsizeof() is не способ использования для определения печатного размера. Объект python memory footprint - плохой индикатор количества символов, необходимых для представления объекта 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.

Демо:

>>> printlen(data1, data2, data3, data4, data5, data6) 
136 
+0

Я знаю, что sys.getsizeof не представляет количество требуемых символов. Я планирую переместить эти данные в базу данных, если это окажется выполнимым, и как таковые просто хотят узнать приблизительный размер множества объектов каким-то измеримым образом, будь то длина печати или объем памяти. Пространства будут достаточно пренебрежимыми. (Я предполагаю, что следы Python разумны). Проблема с использованием 'len' и' str' заключается в том, что не все мои объекты легко привязываются к строкам, и я искал решение, которое не зависело от разных обработок разных типов данных. – vroomfondel

+0

Ни строка, ни 'getizeof()' не будут правильными индикаторами. Вам необходимо использовать фактическое представление, которое ** база данных ** использует для измерения базы данных. –

+0

Например, 'dict' - это контейнер. 'sys.getsizeof()' возвращает требование к памяти * только для этого контейнера *, а не содержимое. И этот размер зависит от вашей платформы; указатель на 32-битной архитектуре меньше указателя на 64-битной платформе. –

1

Это должен теперь сделать это правильно:

def printlen(*args): 
    return sum(map(len, map(str, args))) 

Для объектов, которые не поддерживают функцию str(obj). Вы могли бы заменить str с самодельных функции или лямбда:

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

Это не будет работать для объектов, которые не имеют длины. Пользовательский класс и целое число в образце не имеют длины. –

+0

Хорошая точка. Я не правильно прочитал вопрос, так как он хочет, чтобы длина напечатанных строк – ikkuh

+0

@ikkuh благодарит. Как насчет переменных, которые я не могу легко передать в строки? Как строка unicode, которая имеет неожиданные символы, или пользовательский класс, который не относится к этому типу. Вот почему я ищу решение, которое в основном копирует поверх печати. – vroomfondel

0

Если вы хотите длину вы можете использовать это:

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

использование:

printlen(obj1, obj2, ..) 
0

Если у вас есть и вы хотите знать, сколько требуется для его хранения, вы также можете использовать объект и использовать его в качестве меры, а также lso хранить данные в базе данных.

Смежные вопросы