Python - указание длины строк, в основном - PullRequest
1 голос
/ 28 февраля 2012

У меня есть программа, которая возвращает число (на данный момент 6) числовых результатов, преобразует их в строки, а затем объединяет их для отправки по ZMQ.

Примеры выходных данных:

Результаты: 7,85, -5,75, 16,0, 0,0, 0,84375, 0,828125

7.85-5.7516.00.00.843750.828125

Результаты: 5,25, -10,72, 8,5, 0,0, 0,752, 0,8265

5.25-10.728.50.00.7520.8265

После получения этогострока через ZMQ. Затем мне нужно снова разделить его на части.

Чтобы сделать это, я думаю, что указание длины строк - самый простой способ, поэтому я всегда знаю, что у меня будет x символов для каждогоответ, и я могу затем использовать stringsplit в конце, чтобы получить мои индивидуальные результаты.

Проблема в том, что я не могу понять, как это сделать.Я знаю, как указать количество десятичных знаков, но когда у меня целые числа, состоящие из одной или двух цифр, иногда со знаком -, я немного застрял ...

спасибо

Ответы [ 2 ]

6 голосов
/ 28 февраля 2012

Вот код, демонстрирующий подход, который я рекомендовал в своем комментарии.

Это список результатов вашей программы (если они не входят в список, поместите их в один):

>>> nums = [1,2,3,4,5,6]

Теперь мы используем map(str,nums) для преобразования каждого числа в строку и соединяем их вместе запятыми между ними, вызывая метод .join() строкового литерала ',':

>>> mystr = ','.join(map(str,nums))
>>> mystr
'1,2,3,4,5,6'

Вызов map(str,nums) означает «Применить функцию str (которая преобразует вещи в строку) к каждому элементу массива nums и сохранить результаты в массиве». map - это мощная функциональная программная идиома, которую вы можете использовать для значительного сокращения кода (см. Википедия ).

Наконец, вы используете метод split в вашей строке, чтобы отделить ее при появлении запятой, и используйте map(float,-) для преобразования строк обратно в числа с плавающей запятой:

>>> map(float,mystr.split(','))
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
2 голосов
/ 28 февраля 2012

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

Вот код для сравнения эффективности обоих способов:

import time
import cPickle
import random

random.seed()
l = [ random.random()*1000 for i in xrange(100000) ]

t0 = time.time()
s1 = ','.join(map(str,l))
t1 = time.time() - t0

t0 = time.time()
s2 = cPickle.dumps(l, -1)
t2 = time.time() - t0

print 's1: len1=%s t1=%s' % (len(s1), t1)
print 's2: len2=%s t2=%s' % (len(s2), t2)
print 's2/s1: len2/len1=%s t2/t1=%s' % (float(len(s2))/len(s1), t2/t1)

и вывод:

s1: len1=1389129 t1=0.281008005142
s2: len2=900206 t2=0.0193469524384
s2/s1: len2/len1=0.648036287487 t2/t1=0.0688484031925

вы можете видеть, что способ cPickle намного быстрее (в 14,5 раз быстрее) и эффективнее с точки зрения размера данных, которые вы должны передать (64%).

Для получения списка из маринованного объекта следует использовать

l = cPickle.loads(s2)

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...