在 Python 中连接字符串的首选方法是什么? [复制]

2023-11-23

自从Python的string无法更改,我想知道如何更有效地连接字符串?

我可以这样写:

s += stringfromelsewhere

或者像这样:

s = []

s.append(somestring)
    
# later
    
s = ''.join(s)

在写这个问题的时候,我发现一篇很好的文章讨论了这个话题。

http://www.skymind.com/~ocrow/python_string/

但它是在 Python 2.x 中的,所以问题是 Python 3 中是否发生了一些变化?


The best将字符串附加到字符串变量的方法是使用+ or +=。这是因为它可读且速度快。它们也同样快,您选择哪一种取决于口味,后一种是最常见的。以下是与timeit module:

a = a + b:
0.11338996887207031
a += b:
0.11040496826171875

然而,那些建议使用列表并附加到列表中然后加入这些列表的人会这样做,因为与扩展字符串相比,将字符串附加到列表可能非常快。在某些情况下,这可能是真的。例如,这里有一个 一百万次追加一个单字符字符串,首先追加到一个字符串,然后追加到一个列表:

a += b:
0.10780501365661621
a.append(b):
0.1123361587524414

好吧,事实证明,即使生成的字符串有一百万个字符长,附加仍然更快。

现在让我们尝试附加一千个字符的长字符串十万次:

a += b:
0.41823482513427734
a.append(b):
0.010656118392944336

因此,最终字符串的长度约为 100MB。这相当慢,附加到列表要快得多。该时间不包括决赛a.join()。那么这需要多长时间?

a.join(a):
0.43739795684814453

哎呀。事实证明,即使在这种情况下,追加/连接速度也较慢。

那么这个推荐从何而来呢? Python 2?

a += b:
0.165287017822
a.append(b):
0.0132720470428
a.join(a):
0.114929914474

嗯,追加/连接是边际地如果你使用极长的字符串(通常不会,那么你会拥有一个内存为 100MB 的字符串吗?)

但真正的关键是 Python 2.3。我什至不会告诉你时间,因为它太慢了,还没有完成。这些测试突然发生minutes。除了追加/连接之外,它与后来的 Python 一样快。

是的。在石器时代,Python 中的字符串连接速度非常慢。但在 2.4 上它不再存在了(或者至少是 Python 2.4.7),因此使用追加/连接的建议在 2008 年就已经过时了,当时 Python 2.3 停止更新,你应该停止使用它。 :-)

(更新:事实证明,当我更仔细地进行测试时,使用+ and +=在 Python 2.3 上对于两个字符串也更快。使用建议''.join()一定是误会)

然而,这是CPython。其他实现可能有其他问题。这也是过早优化成为万恶之源的另一个原因。除非您首先测量它,否则不要使用被认为“更快”的技术。

因此,进行字符串连接的“最佳”版本是使用 + 或 +=。如果这对你来说很慢(这不太可能),那么就做其他事情。

那么为什么我在代码中使用大量追加/连接呢?因为有时它实际上更清楚。特别是当您应该连接在一起的任何内容都应该用空格、逗号或换行符分隔时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中连接字符串的首选方法是什么? [复制] 的相关文章

随机推荐

  • 适用于 iPhone 的 UIPOPOVER?或者是假的?

    谁能看一下这个吗 http www woowoomac com storage awesome note iphone note todo app menus jpg SQUARESPACE CACHEVERSION 12685817624
  • 如何让 CRON 调用正确的路径

    我试图让 cron 调用正确的路径 当我从 shell 运行 Python 脚本时 脚本运行良好 因为它使用 bashrc 中设置的 PATH 但是当我使用 cron 时 所有 PATH 都不会从 bashrc 使用 是否有一个文件可以像
  • WCF 4 服务的扁平 WSDL

    使用 WCF 3 5 和来自 Christian Weyer 的 FlatWsdl EndpointBehavior 我能够为我的 WCF 服务获取单个平面 WSDL 文件 而无需任何
  • DDD-- 如何补充水分

    Question 从存储库中重新水化聚合体的最佳 高效且面向未来的方法是什么 所提供的方法有哪些优点和缺点 我的看法是否正确 假设我们有一个带有私有 setter 和公共 getter 的聚合根用于访问state 行为是通过聚合根上的方法完
  • Dynamic_cast 中的类型必须是完整类类型的指针或引用,或者 void *

    我希望有人能理解为什么下面的代码失败 我试图从 osg Node 节点对象获取 PositionAttitudeTransform Openscenegraph 类 的实例 但下面有粗体的编译器错误 void CameraPosCallba
  • 为什么扩展元素不适合复制多维数组?

    来自MDN 传播语法 注意 通常 ES2015 中的扩展运算符在复制数组时会深入一层 因此 它们不适合复制多维数组 这与 Object assign 和对象扩展语法的情况相同 请参阅下面的示例以更好地理解 var a 1 2 3 var b
  • Codeigniter 如何创建 PDF

    我要创建一个发票系统 我现在正在为此做准备 我将使用 Codeigniter 问题是我想创建 PDF 格式的发票 这样我就可以通过电子邮件发送它 你们有什么建议 我正在考虑 HTML 到 PDF 的转换 或者在屏幕上显示发票并安装 pdf
  • Boost 随机和 OpenMP

    我从 OpenMP 并行代码部分收到 总线错误 我在下面重新创建了我的问题的简单版本 该代码本质上对函数进行了多次调用uniform distribution 它使用 Boost 的uniform int distribution 绘制 0
  • SQL Server 2005 - 将列设置为只读

    我在 SQL Server 2005 数据库的表中有一个 InsertTime 字段 当记录首次插入数据库时 该字段默认为 getDate 我想确保此专栏不再更新 是否可以将此列设置为只读 或者是否有更好的方法来执行此操作 而无需为开发人员
  • 使用 Java 的 Google 数据存储模拟器(不使用 GAE)

    我正在使用 Google Cloud 的 Java 数据存储客户端库来访问 Cloud Datastore Note 我没有使用 App Engine 来部署我的应用程序 只是出于开发目的运行本地应用程序 按照示例 我可以读取 写入云数据存
  • 将模板成员函数的专门化定义(没有默认主体)放在源文件中是否安全?

    这就是我的意思 test h class cls public template lt typename T gt void f T t test cpp template lt gt void cls f const char main
  • 关于不使用 Interface Builder 进行 iPhone GUI 设计的教程?

    有谁知道有关仅使用代码而不是 Interface Builder 进行 iPhone GUI 设计的好教程吗 我是 iPhone 开发新手 我想更好地了解幕后发生的事情 查看 SDK 中的 UI 目录示例 它展示了以多种方式使用的所有单独控
  • 我可以在不安装的情况下使用git吗?

    我听说过有关 git 的好消息 我想在安装它之前尝试一下 如果我想在学校使用 git 那么将它放在闪存驱动器上也很棒 是否可以使用完整路径 例如 path to git init 我主要使用 Mac OS X 所以问题主要针对 Mac 但我
  • Symfony/Doctrine:DateTime 作为主键

    我正在尝试使用日期作为主键创建一个实体 问题是 Symfony 无法将我正在使用的 DateTime 转换为字符串以将其引入到 IdentityMap 中 在实体持久化期间出现以下错误 Catchable Fatal Error Objec
  • PHP 运算符优先级和字符串连接?

    请看下面的代码片段 i 1 echo i i 很快 我以为结果会是12但实际结果是21 also echo i i 我以为会是12但它的11 echo i i result is 1 echo i i 1 result is 2 But w
  • 在通用 lambda 中使用模板参数

    GCC允许使用以下语法作为扩展 a functional object that will add two like type objects auto add
  • 默认参数和可变参数函数

    有没有办法在可变参数函数中指定默认参数 也适用于模板 在 C 中 您可以将可变参数函数替换为基于命名参数习惯用法的函数 请参阅 C 常见问题解答项10 20 什么是 命名参数习惯用法 这为您提供了默认功能和方便的符号 干杯
  • 将 web.xml 安全约束与 Spring Boot 结合使用

    我有一个特殊的情况 我需要使用应用程序服务器 Weblogic 安全上下文进行身份验证 但使用 Spring Security 进行授权 我在用Spring Boot创建我的应用程序 如何添加如下所示的安全约束 通常包含在web xml
  • Python 列表:列表中具有重复值的 heapq.nlargest 索引

    假设我有一个数字列表 my list 3 8 4 2 8 1 1 2 5 1 我现在想找到这个列表中两个最大数字的索引 所以 我尝试 import heapq max vals heapq nlargest 2 my list index1
  • 在 Python 中连接字符串的首选方法是什么? [复制]

    这个问题在这里已经有答案了 自从Python的string无法更改 我想知道如何更有效地连接字符串 我可以这样写 s stringfromelsewhere 或者像这样 s s append somestring later s join