【问题标题】:How to quickly convert lots of data to string?如何快速将大量数据转换为字符串?
【发布时间】:2021-12-11 13:07:49
【问题描述】:

假设我有以下课程:

import numpy as np

class ToStringify():
    DEMARCATION = "::::"
    def __init__(self):
        self.first_np_array = np.random.rand(30, 30, 30)
        self.second_np_array = np.random.rand(30, 30, 30)
        self.some_string = "string"
        self.some_int = 5

    def to_str_format(self) -> str:
        entries = [
            self.first_np_array, self.second_np_array, self.some_string, self.some_int
        ]
        return f"{self.DEMARCATION}".join([str(entry) for entry in entries])

我已经分析了我的代码,to_str_format 占用了我总程序运行时间的大约 25%。不幸的是,to_str_format 需要输出一个字符串(无论我选择什么分界线),它将在某些我无法更改的管道中进一步消耗。我正在做一个列表理解来尝试加快速度,但除此之外我不确定我还能做什么(如果有的话)。如果有任何改变,我正在使用 python 3.9

【问题讨论】:

  • 我非常乐意添加更多详细信息或说明,但目前我不知道添加什么会有所帮助。回复:关闭标志
  • 我认为您的问题不需要更多细节或清晰度……而且您做事的方式可能是将几种不同的东西转换为您想要的字符串格式的最快方法。你为什么要优化它——它是你程序的瓶颈吗? Premature optimization is the root of all evil.
  • > 你为什么要优化它——它是你程序中的瓶颈吗?它是第一个 (25%) 与第二个 (19%) 相比。是的,我担心这可能是最快的
  • 好吧,除了一些我怀疑只是相对较小的调整——大多数都显示在@sj95126 的回答中,我唯一能想到的另一件事是为什么要通过class 一个简单的函数就足够了。
  • 啊,我应该很清楚这一点,但课堂上还有其他方法。我只是不想让人们陷入(看似)不必要的并发症

标签: python string numpy


【解决方案1】:

您必须再次进行分析,以验证这些建议中的任何一个是否会产生足够大的影响,但快速的非正式测试显示可能有 10-15% 的改进,因此它可能会有所帮助。

首先,这个:

join([str(entry) for entry in entries])

[ ] 不是必需的。 join() 可以使用生成器表达式,因此列表推导只会增加创建(可能很大)对象的开销。所以:

join(str(entry) for entry in entries)

可能会快一点(似乎大约 5%)。甚至比这更快(大约 10%)的是:

join(map(str, entries))

其次是 f 字符串。如果您根本不修改或更改 DEMARCATION 的表示形式,这就足够了:

self.DEMARCATION.join(....)

这避免了处理 f 字符串的开销。总之,这可能是最有效的形式:

return self.DEMARCATION.join(map(str, entries))

另外一件事是entries 列表。如果to_str_format() 被多次调用,并且entries 永远不会改变(也就是说,它始终是这4 个对象的列表),那么最好在其他地方设置一次(例如,实例或类属性)。将其创建为元组而不是列表也可能稍微快一些。

【讨论】:

  • 完美!这确实加快了代码速度。非常感谢!
  • @IanQ:很高兴它有帮助!如果您愿意,可能值得在时间之前和之后更新问题,以显示其他人搜索相同问题的技术的加速。
猜你喜欢
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
相关资源
最近更新 更多