我正在运行一些速度太慢的模拟,因此我对我的代码进行了分析,发现超过90%的时间用于将(2D)numpy数组转换为字符串,如:
arr = np.ones(25000).reshape(5000,5)
s = '\n'.join('\t'.join([str(x) for x in row]) for row in arr]
我尝试了一堆不同的解决方案(使用map,使用astype(str)转换数组,转换为列表)但大多数只给出了微小的改进。
最终我放弃了尝试将数组转换为字符串并使用np.save(arr)
将其保存到文件中,这提供了 2000x (!) 加速。有没有办法将数组写为具有类似性能的文本文件?
答案 0 :(得分:2)
将numpy数组转换为人类可读的形式应该永远不会确定模拟的运行时间。事实上,它甚至不应该(显着)贡献。
您应该在不同的级别上解决此问题。问问自己:您是否真的需要经常以人类可读形式将数组写入文件?它是否经常/经常发生以至于显着决定了代码的运行时间?只有一次,当某个结果出现时,它是否足够?
采用这种方法时,您可能不需要优化当前的写入方法。我可能想给一些数字。考虑到您的模拟大约需要一个小时(不将结果写入磁盘)。我认为你同意,如果你的代码花了10秒钟将你的结果以人类可读的形式写入磁盘,那就没问题了。如果这需要10秒,1秒或100秒,那真的无关紧要。
如果出于某种原因,您确实需要定期将中间结果写入磁盘以供以后处理 - 最小化频率,并使用二进制数据格式。
答案 1 :(得分:2)
尝试使用np.savetxt(“file”,arr)。请参阅此处的文档 - (http://docs.scipy.org/doc/numpy/reference/generated/numpy.savetxt.html)。