【问题标题】:Most efficient way to convert numpy array to string将numpy数组转换为字符串的最有效方法
【发布时间】:2015-02-10 18:26:13
【问题描述】:

我正在运行一些运行速度太慢的模拟,因此我分析了我的代码,发现超过 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(! ) 加速。有没有办法将数组写入具有相似性能的文本文件?

【问题讨论】:

    标签: python numpy profiling


    【解决方案1】:

    将 numpy 数组转换为人类可读的形式应该永远决定模拟的运行时间。事实上,它甚至不应该做出贡献(显着)。

    你应该在不同的层面上解决这个问题。问问自己:您真正需要多久以 人类可读 形式将数组写入文件?它是否需要经常/定期发生以显着决定代码的运行时间?当某个结果出现时,只执行一次就足够了吗?

    当您采用这种方法时,您可能不需要优化您当前的写作方法。我可能想给出一些数字。考虑到您的模拟大约需要一个小时(不将结果写入磁盘)。我认为你同意如果你的代码再花 10 秒时间将结果以人类可读的形式写入磁盘,那很好。如果这需要另外 10 秒、1 秒或 100 秒,这真的无关紧要。

    如果由于某种原因您确实需要定期将中间结果写入磁盘以供以后处理 - 尽量减少频率,并使用 二进制 数据格式。

    【讨论】:

    • 是的,这就是我最终所做的——每次模拟只需要大约 1.5 毫秒,然后转换为字符串大约需要 500 毫秒。
    • 那么——你的问题解决了吗?如果不是:您需要执行多少次这些简短的模拟?输出文件有什么用?为人类还是为机器?这些输出文件有多大? I/O 是限制因素吗?
    • 是的,问题解决了。我只是想知道是否真的有一种方法可以将 numpy 数组写入与 np.save(fn, arr) 相同的性能顺序的字符串。
    • 并回答其他问题;我需要 100 万次模拟;输出文件用于机器(此处的输出正在被另一个分析脚本读取)。我试图为每个文件编写一个字符串标题,以确保我可以检查数据和生成数据的参数是否分开。为了解决这个问题,我将标题移到了与输出相同的文件夹中的自己的文件中。
    • 我明白了。如您所知,专业的 HPC 软件使用 NetCDF 文件格式或分层数据格式 (HDF) 来处理这些事情。以 ASCII 格式(或至少以人类可读的形式)存储此类数据需要耗费 CPU 成本的转换,需要更多的磁盘空间,并且会显着降低处理速度。
    【解决方案2】:

    尝试使用 np.savetxt("file",arr)。请参阅此处的文档 - (http://docs.scipy.org/doc/numpy/reference/generated/numpy.savetxt.html)。

    【讨论】:

    • 我在这里不太赞成,因为 OP 没有提到他们尝试过这个。 IMO 你永远不会像 python 中的 savetxt 一样快(这是为 C 中的工作手动优化的),所以这确实回答了这个问题。也就是说,Jan 的答案是最好的——不要优化这个位/想办法使用二进制数据。
    猜你喜欢
    • 2022-12-07
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 2018-06-10
    • 2012-11-06
    • 2020-10-24
    • 2016-03-10
    相关资源
    最近更新 更多