我有一个程序需要将许多大型的一维numpy浮点数组变成分隔的字符串.相对于我的程序中的数学运算,我发现这个操作相当慢,我想知道是否有办法加速它.例如,考虑以下循环,它在numpy数组中占用100,000个随机数,并将每个数组连接成逗号分隔的字符串.
import numpy as np
x = np.random.randn(100000)
for i in range(100):
",".join(map(str, x))
Run Code Online (Sandbox Code Playgroud)
此循环大约需要20秒才能完成(总计,而不是每个循环).相反,考虑像元素乘法(x*x)这样的100个循环将需要超过1/10秒才能完成.显然,字符串连接操作会产生很大的性能瓶颈; 在我的实际应用程序中,它将主导整个运行时.这让我想知道,有没有比","更快的方式.join(map(str,x))?由于map()几乎是所有处理时间的发生,因此可归结为是否有更快的方式将大量数字转换为字符串.
Mar*_*s R 27
有点晚了,但这对我来说更快:
#generate an array with strings
x_arrstr = np.char.mod('%f', x)
#combine to a string
x_str = ",".join(x_arrstr)
Run Code Online (Sandbox Code Playgroud)
加速在我的机器上大约1.5倍
关于Python中各种字符串连接技术的性能的非常好的写法:http://www.skymind.com/~ocrow/python_string/
我有点惊讶,后面的一些方法表现得和他们一样好,但看起来你肯定能找到一些比你在那里做得更好的东西.
网站上提到的最快方法
方法6:列表推导
Run Code Online (Sandbox Code Playgroud)def method6(): return ''.join([`num` for num in xrange(loop_count)])这种方法最短.我会破坏惊喜并告诉你它也是最快的.它非常紧凑,也很容易理解.使用列表推导创建数字列表,然后将它们连接在一起.不能简单.这实际上只是方法4的缩写版本,它消耗的内存量几乎相同.它更快,因为我们不必每次循环调用list.append()函数.