Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从1d numpy数组生成分隔字符串的最快方法_Python_Numpy - Fatal编程技术网

Python 从1d numpy数组生成分隔字符串的最快方法

Python 从1d numpy数组生成分隔字符串的最快方法,python,numpy,Python,Numpy,我有一个程序,需要将许多大的一维浮点数数组转换为分隔字符串。我发现这个运算相对于我的程序中的数学运算来说相当慢,我想知道是否有办法加快它。例如,考虑下面的循环,它在一个数字数组中取100000个随机数,并将每个数组连接成逗号分隔的字符串。 import numpy as np x = np.random.randn(100000) for i in range(100): ",".join(map(str, x)) 这个循环大约需要20秒才能完成(总共,不是每个循环)。相比之下,考虑到

我有一个程序,需要将许多大的一维浮点数数组转换为分隔字符串。我发现这个运算相对于我的程序中的数学运算来说相当慢,我想知道是否有办法加快它。例如,考虑下面的循环,它在一个数字数组中取100000个随机数,并将每个数组连接成逗号分隔的字符串。
import numpy as np
x = np.random.randn(100000)
for i in range(100):
    ",".join(map(str, x))

这个循环大约需要20秒才能完成(总共,不是每个循环)。相比之下,考虑到像元素乘(x*x)之类的100次循环要花费1/10秒的时间来完成。显然,字符串连接操作造成了很大的性能瓶颈;在我的实际应用程序中,它将主导整个运行时。这让我想知道,有没有比“,”更快的方法。加入(map(str,x))?由于map()是几乎所有处理时间的所在,这就归结为是否有一种更快的方法将大量数字转换为字符串的问题。

非常好地介绍了Python中各种字符串连接技术的性能:

我有点惊讶,后一种方法中的某些方法表现得和它们一样好,但看起来你肯定可以在那里找到比你在那里做的更好的方法

网站上提到的最快方法

方法6:列出理解

def method6():
  return ''.join([`num` for num in xrange(loop_count)])
这种方法是最短的。我会破坏这个惊喜的,告诉你这是真的 也是最快的。它非常紧凑,也很漂亮 可以理解。使用列表创建数字列表 然后把他们都连在一起。再简单不过了。这 实际上只是方法4的一个缩写版本,它使用 几乎相同的内存量。但是速度更快,因为我们 不必每次调用list.append()函数 循环


我认为您可以尝试使用
numpy.savetxt
cStringIO.StringIO
对象作为伪文件传递

或者使用
str(x)
并用逗号替换空格(编辑:这不会很好,因为
str
省略了大型数组:-s)

因为这样做的目的是通过网络发送阵列,所以可能有更好的替代方案(cpu和带宽效率都更高)。我在对另一个答案的评论中指出,将数组的二进制表示编码为Base64文本块。要使其达到最佳状态,主要的不方便之处在于,读取数据块的客户端应该能够做一些令人讨厌的事情,比如将字节数组重新解释为浮点数组,而这在类型安全语言中通常是不允许的;但是,通过C库调用可以快速完成(大多数语言都提供了实现这一点的方法)

如果无法处理位,则始终可以逐个处理数字,将解码的字节转换为浮点数


哦,通过网络发送数据时要注意机器的终端:转换为网络顺序->base64编码->发送|接收->base64解码->转换为主机顺序

numpy.savetxt甚至比string.join还要慢。ndarray.tofile()似乎不适用于StringIO

但我确实找到了一种更快的方法(至少适用于Python 2.5上的OP示例,以及更低版本的numpy):

如果您有一个定义良好的格式(如本例中的格式),则字符串格式似乎比字符串联接更快。但我想知道为什么OP在内存中需要这么长的浮点数串


更新版本的numpy没有显示出速度的提高。

在OP的代码中使用itertools中的imap而不是map,这给了我大约2-3%的改进,虽然改进不多,但可能会与其他想法结合起来,提供更多的改进


就个人而言,我认为如果你想要比这更好的东西,你必须先使用Cython之类的东西。

将numpy数组转换成列表。映射操作在列表上的运行速度似乎比在numpy数组上的运行速度更快

e、 g

在定时测试中,我发现这个例子有15%的加速


我会让其他人解释为什么这可能会更快,因为我不知道

有点晚了,但这对我来说更快:

#generate an array with strings
x_arrstr = np.char.mod('%f', x)
#combine to a string
x_str = ",".join(x_arrstr)
我的机器上的加速约为1.5倍

','.join(x.astype(str))
大约比as慢10%

x_arrstr = np.char.mod('%f', x)
x_str = ",".join(x_arrstr)

但更具可读性。

将数字转换为字符串需要时间吗?将两个整数相乘和转换/串联100000个数字是完全不同的事情-你怎么能期望这两个操作在性能上都是相同的?标记-是的。蒂姆:没错。我的观点很简单,字符串操作造成了一个真正的瓶颈,如果有办法加快速度那就太好了。
float.hex
str
快25%。可以使用
“%a”
格式以其他语言读回。谢谢sblom。不幸的是,我的代码本质上已经与前面提到的最快解决方案相同。也许根本没有办法让它运行得更快。@Abiel如果你真的想让它运行得更快,那么你应该考虑使用Cython。我认为,一般来说,当答案解释了该做什么时,人们都喜欢它,而不仅仅是链接到将来可能会或不会被删除的页面。谢谢fortran。不幸的是,我仍然无法通过savetxt或str(x)来提高速度。str(x)起初似乎快得多,但一旦np.set_printoptions(阈值=100000)(请参阅我对unutbu答案的评论)。Dingle-无论出于何种原因,我都没有发现它比join和str的原始示例快。至于我为什么需要这些长字符串,我有一个服务器应用程序,它在numpy数组上运行,然后以纯文本字符串形式分发结果,以便各种客户端(包括非Python客户端)都可以使用dat
','.join(x.astype(str))
x_arrstr = np.char.mod('%f', x)
x_str = ",".join(x_arrstr)