我有一个程序返回一个数字结果的数字(目前为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来获取我的个人结果。
问题是我无法找到如何做到这一点。我知道如何指定小数位数,但是当我有单/双位整数时,有时带 - 符号,我有点卡住...
感谢
答案 0 :(得分:6)
以下是一些代码,展示了我在评论中推荐的方法。
这是您的程序的结果列表(如果它们没有列入列表,则将它们合并为一个):
>>> nums = [1,2,3,4,5,6]
现在我们使用map(str,nums)
将每个数字转换为字符串,并通过调用字符串文字.join()
的{{1}}方法将它们连接在一起,并将它们连接在一起:
','
调用>>> mystr = ','.join(map(str,nums))
>>> mystr
'1,2,3,4,5,6'
表示“将函数map(str,nums)
(将事物转换为字符串)应用于数组str
的每个元素,并将结果存储在数组中。” nums
是一种功能强大的函数式编程习惯用法,可用于大大缩短代码(参见Wikipedia)。
最后,只要出现逗号,就会在字符串上使用map
方法将其拉开,并使用split
将字符串转换回浮点数:
map(float,-)
答案 1 :(得分:2)
我看到你正在使用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方式更快(x14.5倍快)并且在你必须传输的数据大小方面效率很高(64%)。
要从pickled对象中获取列表,您应该使用
l = cPickle.loads(s2)
希望它有所帮助。