Python 中别再用 ‘+‘ 拼接字符串了!

当我开始学习 Python 时,使用加号+来连接字符串非常直观和容易,就像许多其他编程语言(比如Java)一样。

然而,很快我意识到许多开发者似乎更喜欢使用.join()方法而不是+。

在本文中,我将介绍这两种方法之间的区别,以及为什么你不应该使用+。

开篇

作为一个初学者,或者刚从其他使用加号+连接字符串的语言转换过来的人,很容易写出这样的代码:

图片

随着你对 Python 的使用越来越多,你可能会意识到其他人更喜欢使用join()方法,就像这样:

图片

老实说,当我第一次看到上面的方法时,我觉得它不直观,看起来有点丑陋。

连接多个字符串

尽管如此,有一次我需要连接列表中的多个字符串。

最初,我是这样做的:

图片

在这个例子中,我不得不逐个字符串地编写一个循环来连接它们。

此外,结果字符串需要修剪我在开头添加的空格,因为所有的字符串都需要在前面添加一个空格,但第一个字符串不需要。

你可能有其他的解决方案,比如在for循环中添加一个索引,使得索引等于0的字符串不需要添加这个空格。无论如何,你仍然需要这个for循环,并且需要做一些处理来去掉这些空格。

之后,我想起了之前见过的.join()方法,也许这就是我需要使用它的时候了!

图片

多么简单啊!一行代码就完成了所有的工作。由于.join()方法是由一个字符串对象调用的,所以字符串对象将被用来连接列表中的每个字符串,因此你不需要担心开头的空格。

你真的认为这是我们需要使用join()方法而不是+的唯一原因吗?NO

join()方法背后的逻辑

现在,让我们就它们的性能进行比较。我们可以使用 Jupyter Notebook 的魔术方法%timeit来评估它们。

图片

以上显示的性能是基于10万次试验,因此结果非常可信和明显。使用join()方法比使用+来连接列表中的字符串快4倍。

为什么会这样呢?

这是我画的一个概念图,用来演示使用+连接字符串的方法。

图片

这说明了for循环和+运算符做了什么:

  1. 每次循环,从列表中找到一个字符串。

  2. Python执行器解释表达式result += ' ' + s,并为空格' '申请内存地址。

  3. 然后,执行器意识到空格需要与一个字符串连接,所以它会为字符串s申请内存地址,对于第一个循环来说,s是“Life”。

  4. 对于每次循环,执行器都需要申请两次内存地址,一次是为了空格,另一次是为了字符串。

  5. 总共有12次内存分配。

然而,join()方法发生了什么呢?

图片

执行器会统计列表中有多少个字符串,这里有6个。

这意味着用于连接列表中的字符串的字符串将需要重复5次(6-1=5)。

它知道总共需要11个内存空间,所以所有这些都将一次性申请并提前分配。

将字符串按顺序放置,返回结果。

因此,显而易见的主要差异在于内存分配的次数,这是性能改进的主要原因。

想象一下,使用join()方法将6个字符串连接在一起已经快了4倍。如果我们要连接很多很多字符串呢?这将会产生更大的差异!

总结

在这篇简短的文章中,我比较了在 Python 中使用+运算符和join()方法连接字符串时的差异。显然,由于性能原因,更倾向于使用join()方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/645142.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络(1

网络初识 目录 网络初识一. 网络分类1. 局域网LAN(Local Area Network):2. 广域网WAN(Wide Area Network): 二. 组建网络的基础设备1. 路由器2. 交换机 三. 标识符 协议 (protocol)一. 协议分层1. 分层的好处2. OSI七层分层3. TCP/IP五层模型(或四层) 模型(1. 物理层(可不算)(2…

从零开始:手把手教你使用Python实现PDF到Excel的转换

来百 在日常工作和学习中,我们经常会遇到需要将PDF文件中的数据提取到Excel表格中的情况。可能是为了进行数据分析、报告生成或者其他目的。虽然手动复制粘贴是一种方法,但对于大量的数据来说,这种方式显然效率太低。幸运的是,Py…

摸鱼大数据——Hive基础理论知识——Hive基础架构

1、Hive和MapReduce的关系 1- 用户在Hive上编写数据分析的SQL语句,然后再通过Hive将SQL语句翻译成MapReduce程序代码,最后提交到Yarn集群上进行运行 2- 大家可以将Hive理解成有道词典,帮助你翻译英文 2、Hive架构 用户接口: 包括 CLI、JDBC/…

ISCC——AI

得到一个T4.pyc 回编译一下 得到下面代码 import base64def encrypt_and_compare(user_input, offset_str, target_base64):if len(user_input) ! 24:return Please enter a string with a length of 24encrypted Nonefor i, char in enumerate(user_input):offset int(off…

自然资源-各级国土空间总体规划的审查要点及流程总结

自然资源-各级国土空间总体规划的审查要点及流程总结 国土空间规划是对一定区域国土空间开发保护在空间和时间上作出的安排,包括总体规划、详细规划和相关专项规划。 国土空间规划管理是国土空间规划中重要的一环。中共中央、国务院发布《关于建立国土空间规划体系…

C++ Primer Plus第十八章复习题

1、使用用大括号括起的初始化列表语法重写下述代码。重写后的代码不应使用数组ar。 class z200 { private:int j;char ch;double z; public:Z200(int jv,char chv,zv) : j(jv), ch (chv), z(zv){} };double x 8.8; std::string s "what a bracing effect ! …

添砖Java(十一)——常见类的使用Object,Math,System,BigDeciaml,包装类

目录 object: toString: equals: ​编辑 Math:​编辑 System: BigDecimal: 基本数据的包装类:​编辑 object: 我们知道,所有的类都是间接或直接继承了object类。然后object里面有几个用得很多的方法…

使用printf的两种方法,解决printf不能使用的问题

使用printf的两种方法,解决printf不能使用的问题 一、微库法 我们使用printf前要加上重定向fputc //重定义fputc函数 int fputc(int ch, FILE *f) { while((USART1->SR&0X40)0);//循环发送,直到发送完毕 USART1->DR (uint8_t) ch; return…

【JVM实践与应用】

JVM实践与应用 1.类加载器(加载、连接、初始化)1.1 类加载要完成的功能1.2 加载类的方式1.3 类加载器1.4 双亲委派模型1.5自定义ClassLoader1.6 破坏双亲委派模型2.1 类连接主要验证内容2.2 类连接中的解析2.3 类的初始化3.1 类的初始化时机3.2 类的初始化机制和顺序3.2 类的卸…

RedHat9 | DNS剖析-配置辅助DNS服务器

一、实验环境 1、辅助域名DNS服务器 DNS通过划分为若干个区域进行管理,每一个区域由1台或多台DNS服务器负责解析,如果仅仅采用1台DNS服务器,在DNS服务器出现故障后,用户将无法完成解析。 辅助DNS服务器的优点 容灾备份&#x…

Star-CCM+中滞环的实现—场平均监视

前言 前文有介绍过通过更新事件来实现滞环,但是更新事件的方法比较繁琐,应用起来比较困难,本文将介绍一种简单的方法来实现滞环功能。即通过场平均监视来实现,具体方法如下: 一 创建场平均监视 首先在检测量下创建“场平均监视”,具体操作步骤如下图所示: 二 创建质量…

企业客户信息反馈|基于SprinBoot+vue的企业客户信息反馈平台(源码+数据库+文档)

企业客户信息反馈平台 目录 基于SprinBootvue的企业客户信息反馈平台 一、前言 二、系统设计 三、系统功能设计 1平台功能模块 2后台登录 5.2.1管理员功能 5.2.2客户功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&am…

如何使用DotNet-MetaData识别.NET恶意软件源码文件元数据

关于DotNet-MetaData DotNet-MetaData是一款针对.NET恶意软件的安全分析工具,该工具专为蓝队研究人员设计,可以帮助广大研究人员轻松识别.NET恶意软件二进制源代码文件中的元数据。 工具架构 当前版本的DotNet-MetaData主要由以下两个部分组成&#xf…

matlab 使用Otsu方法计算图像全局阈值

目录 一、概述1、算法概述2、主要函数3、参考文献二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述

Java----Maven详解

前言 Maven是Java项目的构建工具,通过项目对象模型(POM)管理项目配置信息,自动化构建、测试和部署过程。开发人员可定义项目结构、依赖和构建流程,提高开发效率和质量。本文介绍基本概念和用法,帮助您更好…

大工作量LUAD代谢重编程模型多组学(J Transl Med)

目录 1,单细胞早期、晚期和转移性 LUAD 的细胞动力学变化 2,细胞代谢重编程介导的LUAD驱动恶性转移的异质性 3,模型构建 S-MMR评分管线构建 4,S-MMR 模型的预后评估 5, 还开发了S-MMR 评分网络工具 6&#xff0c…

笔记89:LeetCode_135_分发糖果

前言: 注:代码随想录中没有很清楚的提起想出方法的思路,只是给出了解决这个问题的大致思路和代码;下面我将介绍一下我的思考过程,并贴出实现代码; a a a a 思考过程: 思路1:为了…

Hadoop3:HDFS中DataNode与NameNode的工作流程

一、DataNode中的数据情况 数据位置 /opt/module/hadoop-3.1.3/data/dfs/data/current/BP-823420375-192.168.31.102-1714395693863/current/finalized/subdir0/subdir0块信息 每个块信息,由两个文件保存,xxx.meta保存的是数据长度、校验和、时间戳&am…

【halcon】set_part 实现平移和缩放 彻悟版

背景 之前写了一篇关于set_part 的文章 ,确实也实现了平移和缩放。平移是对的,但是缩放其实有畸变。这个问题一直都困扰着我,知道昨天连续测试了好几个小时,直到晚上11点终于完美解决。 坐标和高宽 坐标 再讲set_part 之前&am…