2012-02-28 6 views
1

숫자 결과 (숫자 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을 사용하여 개별 결과.

문제는 어떻게 해결할 수없는 것입니까? 나는 소수 자릿수를 지정하는 방법을 알고 있지만, 가끔 함께, 싱글/더블 자리 정수가있을 때 - 표지판, 나는 붙어 조금 ...

감사

+5

가장 쉬운 방법은 ','. join()'을 사용하여 쉼표로 숫자를 연결 한 다음 다른 끝에 쉼표로 분리하여'str.split (',')' –

+0

... ZMQ 란 무엇입니까? –

+0

http://www.zeromq.org/ –

답변

2

난 당신이 ZMQ와를 사용하는 참조 : 마지막으로

, 당신은 쉼표가 나타날 때마다 그것을 떨어져 당겨, 부동 소수점 숫자로 문자열을 다시 변환 할 map(float,-)를 사용하도록 문자열에 split 방법을 사용 그래서 당신이 더 나은 성능을 원한다고 생각합니다. 그렇다면이 목록을 문자열로 변환하는 대신에 포장하기 위해 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 방법은 훨씬 더 빨리 (x14.5 시간 빠름)입니다 볼 수 있으며, 전송해야하는 데이터의 크기면에서 효율적입니다 (64 %).

절인 개체의 목록을 얻기 위해 당신은

l = cPickle.loads(s2) 

는 희망이 도움 사용해야합니다.

6

를 얻을 여기에 방법을 보여주는 몇 가지 코드입니다 나는 내 의견에서 추천했다.

>>> 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은 코드를 상당히 단축하는 데 사용할 수있는 강력한 함수 프로그래밍 관용구입니다 (Wikipedia 참조).

>>> map(float,mystr.split(',')) 
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0] 
+0

멋진 아이디어와 아름다운 작품. thanks – sambasam

+0

map (float, mystr.split (',')) 대신 mystr.split (',')에서 x에 대해 [float (x)]를 사용할 수 있습니다. – Pierce

관련 문제