【问题标题】:What's the best Python string split approach? [closed]什么是最好的 Python 字符串拆分方法? [关闭]
【发布时间】:2021-12-31 10:49:16
【问题描述】:

我正在重构一些 python 代码,并注意到原始创建者每次需要从结果拆分列表中获取一个元素时都会调用拆分方法,而不是将拆分结果存储为变量。

我想知道这两个选项之间是否有任何性能优势,或者一个比另一个更Pythonic?

例如我会做什么

words = sentence.split(" ")
first_word = words[0]
second_word = words[1]

他们做了什么

first_word = sentence.split(" ")[0]
second_word = sentence.split(" ")[1]

【问题讨论】:

  • first_word, second_word, *_ = sentence.split(" ")?这避免了您犯的错误的风险:重复相同的索引。将字符串拆分两次当然没有意义。
  • 啊哈,好点子!我已经纠正了这个错误,但我同意不要多次拆分。我的想法是,它的效率肯定也略低吗?
  • 原始代码将(大约)使用 2 倍的 CPU

标签: python split pep


【解决方案1】:

如果要优化,将拆分限制为 2 次,只保留前 2 项:

first_word, second_word = sentence.split(' ', maxsplit=2)[:2]

这样你只需要拆分一次,并且不需要将中间存储在内存中。

如果那么句子很小:

first_word, second_word, _ = sentence.split(' ', maxsplit=2)

长句进一步优化

如果你想进一步优化,你需要避免读取整个字符串。

为此,您需要获取前 2 个空格的索引并对字符串进行切片:

i = sentence.index(' ')
j = sentence.index(' ', i+1)
first_word, second_word = sentence[:i], sentence[i+1:j]

对 10 万字句子 (sentence = ' '.join(['abc']*100000)) 的测试显示,与 split 相比,速度提高了 30 倍。然而,这种方法在处理小字符串时效率并不高(甚至效率更低)。

【讨论】:

  • 如果真要优化,最好避免切片:first_word, second_word, _ = sentence.split(' ', maxsplit=2)
  • @Expurple 我不确定,这也设置了一个消耗内存/垃圾收集的新变量。快速测试告诉我,大型列表的时间差最小。如果有人确定句子会small,那么我同意你的看法;)
  • 无论如何,在这两种情况下,带有剩余句子的对象都是由.split 创建的。使用我的解决方案,它只是(可能?)稍后收集垃圾,因为它需要比_ 绑定更长。
  • @Expurple 我为长句添加了更好的方法
  • 是的,看起来不错,这种方法不需要将句尾复制到新字符串中。
【解决方案2】:

@mozway 的答案 + cmets 很好地涵盖了性能方面,应该是公认的答案。

你还想知道“更 Pythonic”的方式,所以我会在上面加两分钱。

在我看来,最容易阅读的选项实际上是原始选项,因为它调用了单词words。它甚至不需要读者理解sentence.split(" ") 到底在做什么:)

如果您还想要性能,下一个最佳选择是我提出的解决方案:

first_word, second_word, _ = sentence.split(' ', maxsplit=2)

它既漂亮(仅拆分一次,并且不会在 and 处拆分不必要的单词),而且非常清楚它的作用:获取前 2 个单词并丢弃其余单词。它也是单行的:)

【讨论】:

    猜你喜欢
    • 2020-07-11
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多