2025年程序员自学书籍(程序员自学书籍哪个好)

程序员自学书籍(程序员自学书籍哪个好)p 来源 cnblogs com three fighter p 13641835 html br p p br p p 众所周知 程序员是一个需要不断学习的职业 而幸运的是 在这个互联网时代 知识就在那里 等着我们去获取 p p p

大家好,我是讯享网,很高兴认识大家。




讯享网

                                                 	<p>来源:cnblogs.com/three-fighter/p/13641835.html<br/></p><p><br/></p><p>众所周知,程序员是一个需要不断学习的职业,而幸运的是,在这个互联网时代,知识就在那里,等着我们去获取。</p><p><strong>一、在线教程</strong><br/></p><p>首先列出一些在线教程网站,这些在线教程网站通常都比较适合入门,可以作为开发学习路上的第一个阶梯,也可以作为工作中的在线文档。</p><p>1、菜鸟教程<br/></p><p>地 址:https://www.runoob.com/</p><p>简 介:在线教程网站,前端学习看这两个网站就够了。</p><p>推荐指数:⭐⭐⭐</p><p>2、易百教程<br/></p><p>地 址:https://www.yiibai.com/</p><p>简 介:内容比较全面的在线教程网站。</p><p>推荐指数:⭐⭐⭐</p><p>3、码农教程<br/></p><p>地 址:http://www.manongjc.com/</p><p>简 介:大量IT编程入门教程(JAVA, PHP, JAVAsc_ript, C, C++, HTML, CSS等)。</p><p>推荐指数:⭐⭐⭐</p><p>4、简单教程<br/></p><p>地 址:https://www.twle.cn/</p><p>简 介:大量IT编程入门教程(前端、移动端、Java、.net等)。</p><p>推荐指数:⭐⭐⭐</p><p>5、Break易站<br/></p><p>地 址:https://www.breakyizhan.com/</p><p>简 介:比较多的编程教程(Java、前端、服务端部署等)。</p><p>推荐指数:⭐⭐⭐</p><p>6、C语言中文网<br/></p><p>地 址:http://c.biancheng.net/</p><p>简 介:以C语言为主,也包含数据结构、C++、Linux等。</p><p>推荐指数:⭐⭐</p><p>7、http://jenkov.com<br/></p><p>地 址:http://tutorials.jenkov.com/</p><p>简 介:一个国外的技术网站,提供了非常不错的Java教程。</p><p>推荐指数:⭐⭐⭐</p><p>8、http://baeldung.com<br/></p><p>地 址:https://www.baeldung.com/</p><p>简 介:也是一个国外的技术网站,提供了非常不错的Java教程。</p><p>推荐指数:⭐⭐⭐</p><p><br/></p><p><strong>二、视频教程</strong></p><p>上面的在线教程网站以文字性内容为主,同样收藏了一些以视频为主的一些网站,相比较而言,更容易上手,当然,也更加耗时间。</p><p>1、B站</p><p>地 址:https://www.bilibili.com/</p><p>简 介:众所周知,bilibili也可以用来学习,除了番剧、鬼畜之外,b站同样有非常多的高质量的编程教学视频。</p><p>推荐指数:⭐⭐⭐⭐⭐</p><p>2、慕课网<br/></p><p>地 址:https://www.imooc.com/</p><p>简 介:比较不错的编程视频教学网站,可以找到比较体系的东西,当然,有些内容要花钱就是了。</p><p>推荐指数:⭐⭐⭐</p><p>3、中国大学MOOC<br/></p><p>地 址:https://www.icourse163.org/</p><p>简 介:有很多名校的课程,当然不止CS。</p><p>推荐指数:⭐⭐⭐⭐</p><p>4、网易云课堂<br/></p><p>地 址:https://study.163.com</p><p>简 介:有一些计算机编程方面的视频教程。</p><p>推荐指数:⭐⭐⭐</p><p>5、实验楼<br/></p><p>地 址:https://www.lanqiao.cn/courses/</p><p>简 介:IT技术课程网站。</p><p>推荐指数:⭐⭐</p><p>6、我要自学网<br/></p><p>简 介:比较多的自学教程,有程序设计内容的分类。</p><p>推荐指数:⭐⭐</p><p>7、大学生自学网<br/></p><p>地 址:http://v.dxsbb.com/jisuanji/</p><p>简 介:有一些计算机软件的大学课程。</p><p>推荐指数:⭐⭐</p><p>8、极客学院<br/></p><p>地 址:https://www.jikexueyuan.com/</p><p>简 介:IT编程课程网站,付费内容居多。</p><p>推荐指数:⭐⭐</p><p><br/></p><p><strong>三、电子书</strong></p><p>学习编程,有些书是必须要看的,实体书就不多说了,某宝、某东等等电商平台都能买到。</p><p>如果是想做一些笔记或者不方便携带纸质书的时候,电子书也是个不错的选择。</p><p>1、图灵社区</p><p>地 址:https://www.ituring.com.cn/</p><p>简 介:书籍比较全面的图书社区,电子书的价格是纸质书的一半。</p><p>推荐指数:⭐⭐⭐</p><p>2、博文视点</p><p>地 址:http://www.broadview.com.cn/</p><p>简 介:博文视点也是有一些好书的。</p><p>推荐指数:⭐⭐⭐</p><p>3、书栈网<br/></p><p>地 址:https://www.bookstack.cn/</p><p>简 介:一个开源书籍和文档分享站点。</p><p>推荐指数:⭐⭐</p><p>4、计算机书籍控<br/></p><p>地 址:http://bestcbooks.com/</p><p>推荐指数:⭐</p><p>5、it熊猫<br/></p><p>地 址:https://itpanda.net/book/</p><p>推荐指数:⭐</p><p><br/></p><p><strong>四、官网</strong></p><p>毫无疑问,一项技术,最权威的文档一定是它的官方文档,所有的教程、书籍都是直接或者间接在官方相关文档的基础上完成。所以,编程学习,后面最好还是要看官网的。当然,官网大部分都是英文——其实配合一些翻译插件,没有想象中的那么难。</p><p>1、Java</p><p>简 介:这个不需要多介绍,Java官网和Java官方API。</p><p>推荐指数:⭐⭐⭐⭐⭐</p><p>2、Spring<br/></p><p>地 址:https://spring.io/</p><p>简 介:毫无疑问Spring已经成为Java EE事实上的标准。</p><p>推荐指数:⭐⭐⭐⭐⭐</p><p>3、MySQL<br/></p><p>地 址:https://www.mysql.com/</p><p>简 介:MySQL官网</p><p>推荐指数:⭐⭐⭐⭐</p><p>4、MyBatis<br/></p><p>地 址:https://mybatis.org/mybatis-3/zh/index.html</p><p>简 介:国内最流行的Java持久层框架,而且幸运的是,MyBatis文档是有中文版的。</p><p>推荐指数:⭐⭐⭐⭐</p><p>5、Vue.js<br/></p><p>地 址:https://cn.vuejs.org/</p><p>简 介:国内最流行的JS框架,Vue.js的文档是中文的。</p><p>推荐指数:⭐⭐⭐⭐</p><p>6、Linux<br/></p><p>地 址:https://www.linux.org/</p><p>简 介:后端程序员必会的Linux.</p><p>推荐指数:⭐⭐⭐⭐</p><p>7、Git<br/></p><p>地 址:https://git-scm.com/</p><p>简 介:版本管理推荐用Git,同样有中文版本的文档。</p><p>推荐指数:⭐⭐⭐⭐</p><p>8、Dubbo<br/></p><p>地 址:http://dubbo.apache.org/zh-cn/</p><p>简 介:一款高性能的Java RPC框架,国内用的还是比较广泛,源于阿里,中文文档是有的。</p><p>推荐指数:⭐⭐⭐⭐</p><p>9、Redis<br/></p><p>地 址:https://redis.io/</p><p>简 介:最流行的No SQL数据库。</p><p>推荐指数:⭐⭐⭐⭐</p><p><br/></p><p><strong>五、国内博客社区</strong></p><p>了解技术动态、解决各种问题都会用到技术博客。</p><p>1、CSDN</p><p>地 址:https://blog.csdn.net/</p><p>简 介:最大的中文技术博客社区,内容较多较杂。</p><p>推荐指数:⭐⭐</p><p>2、博客园<br/></p><p>地 址:https://www.cnblogs.com/</p><p>简 介:老牌中文技术博客社区,商业化气息要淡一些,之前广为诟病的UI风格也在今年进行了改进,自定义主题也让能让博客百花争艳。</p><p>推荐指数:⭐⭐⭐</p><p>3、简书<br/></p><p>地 址:https://www.jianshu.com/</p><p>简 介:并不是纯粹的技术博客社区,很多伤春悲秋的东西。</p><p>推荐指数:⭐⭐</p><p>4、思否</p><p>地 址:https://segmentfault.com/</p><p>简 介:包含博客、问答的技术社区。</p><p>推荐指数:⭐⭐⭐</p><p>5、开源中国<br/></p><p>地 址:https://www.oschina.net</p><p>简 介:一个技术博客社区。</p><p>推荐指数:⭐⭐⭐</p><p>6、51CTO<br/></p><p>地 址: https://www.51cto.com/</p><p>简 介:一个IT技术网站。</p><p>推荐指数:⭐⭐</p><p>7、V2EX<br/></p><p>地 址: https://www.v2ex.com</p><p>简 介:页面风格很朴素,13格很高。</p><p>推荐指数:⭐⭐</p><p>8、腾讯云社区<br/></p><p>地 址: https://cloud.tencent.com/developer</p><p>简 介:腾讯云的开发者社区。</p><p>推荐指数:⭐⭐</p><p>9、阿里云社区<br/></p><p>地 址: https://yq.aliyun.com</p><p>简 介:阿里云的开发者社区。</p><p>推荐指数:⭐⭐</p><p>10、开发者头条<br/></p><p>地 址: https://toutiao.io/</p><p>简 介:一个程序员分享平台。</p><p>推荐指数:⭐⭐⭐</p><p>11、GitChat</p><p>地 址:https://gitbook.cn/</p><p>简 介:一个技术博客社区</p><p>推荐指数:⭐⭐</p><p>12、知乎<br/></p><p>地 址: https://www.zhihu.com/</p><p>简 介:知乎是个综合性的问答社区,但是聚集的程序员也比较多,有一些高质量的问答和专栏。</p><p>推荐指数:⭐⭐⭐</p><p><br/></p><p><strong>六、国外技术博客社区</strong></p><p>上面介绍了一些国内的博客社区,事实上,放眼看世界也很重要。</p><p>1、Stack Overflow</p><p>地 址: https://stackoverflow.com/</p><p>简 介:全球最活跃的程序员技术问答交流社区,有人说程序员的所有问题都能在上面找到答案。</p><p>推荐指数:⭐⭐⭐⭐⭐</p><p>2、http://dev.io<br/></p><p>地 址: https://dev.to/</p><p>简 介:不错的技术社区。</p><p>推荐指数:⭐⭐⭐⭐</p><p>3、DZone<br/></p><p>地 址: https://dzone.com/</p><p>简 介:http://DZone.com是世界上最大的在线社区之一。</p><p>推荐指数:⭐⭐⭐</p><p>4、Bytes<br/></p><p>地 址: https://bytes.com/</p><p>简 介:一个面向开发人员和IT专业人员的交流社区。</p><p>推荐指数:⭐⭐⭐</p><p>5、Google Developers<br/></p><p>地 址: https://developers.google.com/</p><p>简 介:google开发社区。</p><p>推荐指数:⭐⭐⭐</p><p><br/></p><p><strong>七、小微型博客</strong></p><p>上面列出的博客都是比较大型、综合的博客社区,实际上还有很多比较优质某个技术分类的博客、大厂技术博客、小而美的博客。这些博客可能也会发布到各大博客社区,但是这些博客网站风格不一,各有个性。</p><p>1、美团技术团队</p><p>地 址: https://tech.meituan.com/</p><p>简 介:美团技术团队的博客,干货满满。</p><p>推荐指数:⭐⭐⭐⭐⭐</p><p>2、阮一峰的网络日志<br/></p><p>地 址: http://www.ruanyifeng.com/blog/</p><p>简 介:大神阮一峰,博客风格真正做到深入浅出。</p><p>推荐指数:⭐⭐⭐⭐⭐</p><p>3、Web前端导航<br/></p><p>地 址: http://www.alloyteam.com/nav/</p><p>简 介:比较全的Web前端导航,包括 团队组织 、开发社区 、 前端门户、框架类库 等等网站的导航。</p><p>推荐指数:⭐⭐⭐</p><p>4、廖雪峰的官方网站<br/></p><p>地 址: https://www.liaoxuefeng.com/</p><p>简 介:廖雪峰老师的网站,有一些不错的入门教程。</p><p>推荐指数:⭐⭐⭐</p><p>5、酷壳<br/></p><p>地 址: https://coolshell.cn/</p><p>简 介:可以了解陈皓,是个很有个性的人。</p><p>推荐指数:⭐⭐⭐</p><p>6、人工智能社区<br/></p><p>地 址: https://www.captainbed.net/blog-neo/</p><p>简 介:不搞人工智能也可以看看,写的很有意思的教程,可以作为科普看看。</p><p>推荐指数:⭐⭐⭐</p><p><br/></p><p><strong>八、开源社区</strong></p><p>在学习的过程中,可以学习开源社区的优秀项目,也可以把自己的项目发布到开源社区。</p><p>1、GitHub</p><p>地 址: https://github.com/</p><p>简 介:全球最大开源社区,被戏称为全球最大同**友网站。</p><p>每日推荐一个有趣的 GitHub 项目,可以关注公众号:逛逛GitHub</p><p>推荐指数:⭐⭐⭐⭐⭐</p><p>2、码云<br/></p><p>地 址: https://gitee.com/</p><p>简 介:可以看做GitHub的国内版,码云是个不错的替代者。</p><p>推荐指数:⭐⭐⭐⭐</p><p><br/></p><p><strong>九、面试刷题</strong></p><p>1、LeetCode</p><p>地 址: https://leetcode-cn.com/</p><p>简 介:经典的刷题网站,主要是算法题。</p><p>推荐指数:⭐⭐⭐⭐⭐</p><p>2、LintCode<br/></p><p>地 址: https://www.lintcode.com/</p><p>简 介:和LeetCode类似</p><p>推荐指数:⭐⭐⭐⭐</p><p>3、牛客网<br/></p><p>地 址: https://www.nowcoder.com/</p><p>简 介:一个联网求职学习交流社区。</p><p>推荐指数:⭐⭐⭐</p><p style="margin: 15px 8px 1.7em; padding: 0px; outline: 0px; max-width: 100%; min-height: 1em; font-size: inherit; color: inherit; line-height: 2em; box-sizing: border-box !important; overflow-wrap: break-word !important;"><br/></p>                                         




                                                 	<p style="margin-top: 0px; margin-bottom: 0px; padding: 0px; outline: 0px; max-width: 100%; clear: both; min-height: 1em; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei UI&quot;, &quot;Microsoft YaHei&quot;, Arial, sans-serif; font-size: 17px; letter-spacing: 0.544px; text-align: justify; white-space: normal; background-color: rgb(255, 255, 255); box-sizing: border-box !important; overflow-wrap: break-word !important;"><span style="margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; color: black; font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, &quot;PingFang SC&quot;, Cambria, Cochin, Georgia, Times, &quot;Times New Roman&quot;, serif; font-size: 16px; letter-spacing: 0.05em; text-align: left;">Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足。但是,有很多时候,Python 的效率并没有想象中的那么夸张。本文对一些</span><span style="margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; color: black; font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, &quot;PingFang SC&quot;, Cambria, Cochin, Georgia, Times, &quot;Times New Roman&quot;, serif; font-size: 16px; letter-spacing: 0.05em; text-align: left;">&nbsp;Python 代码加速运行的技巧进行整理。</span></p><p><br/></p><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">本文会介绍不少的 Python 代码加速运行的技巧。在深入代码优化细节之前,需要了解一些代码优化基本原则。</p><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">第一个基本原则是不要过早优化。很多人一开始写代码就奔着性能优化的目标,“让正确的程序更快要比让快速的程序正确容易得多”。因此,优化的前提是代码能正常工作。过早地进行优化可能会忽视对总体性能指标的把握,在得到全局结果前不要主次颠倒。</p><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">第二个基本原则是权衡优化的代价。优化是有代价的,想解决所有性能的问题是几乎不可能的。通常面临的选择是时间换空间或空间换时间。另外,开发代价也需要考虑。</p><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">第三个原则是不要优化那些无关紧要的部分。如果对代码的每一部分都去优化,这些修改会使代码难以阅读和理解。如果你的代码运行速度很慢,首先要找到代码运行慢的位置,通常是内部循环,专注于运行慢的地方进行优化。在其他地方,一点时间上的损失没有什么影响。</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">许多程序员刚开始会用 Python 语言写一些简单的脚本,当编写脚本时,通常习惯了直接将其写为全局变量,例如上面的代码。但是,由于全局变量和局部变量实现方式不同,定义在全局范围内的代码运行速度会比定义在函数中的慢不少。通过将脚本语句放入到函数中,通常可带来 15% - 30% 的速度提升。</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;"><strong style="margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; color: rgb(119, 48, 152);">2.1 避免模块和函数属性访问</strong></p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">每次使用(属性访问操作符时)会触发特定的方法,如和,这些方法会进行字典操作,因此会带来额外的时间开销。通过语句,可以消除属性访问。</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">在第 1 节中我们讲到,局部变量的查找会比全局变量更快,因此对于频繁访问的变量,通过将其改为局部变量可以加速运行。</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">除了外,函数中还有的存在,那就是调用的方法。通过将该方法赋值给一个局部变量,可以彻底消除函数中循环内部的使用。</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">避免的原则也适用于类内属性,访问的速度会比访问一个局部变量更慢一些。通过将需要频繁访问的类内属性赋值给一个局部变量,可以提升代码运行速度。</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">任何时候当你使用额外的处理层(比如装饰器、属性访问、描述器)去包装代码时,都会让代码变慢。大部分情况下,需要重新进行审视使用属性访问器的定义是否有必要,使用函数对属性进行访问通常是 C/C++ 程序员遗留下来的代码风格。如果真的没有必要,就使用简单属性。</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;"><strong style="margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; color: rgb(119, 48, 152);">4.1 避免无意义的数据复制</strong></p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">上面的代码中完全没有必要,这会创建不必要的数据结构或复制。</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">另外一种情况是对 Python 的数据共享机制过于偏执,并没有很好地理解或信任 Python 的内存模型,滥用&nbsp;之类的函数。通常在这些代码中是可以去掉复制操作的。</p><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;"><strong style="margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; color: rgb(119, 48, 152);">4.2 交换值时不使用中间变量</strong></p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">上面的代码在交换值时创建了一个临时变量,如果不借助中间变量,代码更为简洁、且运行速度更快。</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;"><strong style="margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; color: rgb(119, 48, 152);">4.3 字符串拼接用join而不是+</strong></p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">当使用拼接字符串时,由于 Python 中字符串是不可变对象,其会申请一块内存空间,将和分别复制到该新申请的内存空间中。因此,如果要拼接 n&nbsp;<span style="margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; letter-spacing: 0.05em;">个字符串,会产生 n-1&nbsp;</span>个中间结果,每产生一个中间结果都需要申请和复制一次内存,严重影响运行效率。而使用拼接字符串时,会首先计算出需要申请的总的内存空间,然后一次性地申请所需内存,并将每个字符串元素复制到该内存中去。</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">&nbsp;条件的短路特性是指对这样的语句, 当为时将直接返回,不再计算;对于这样的语句,当为时将直接返回,不再计算。因此, 为了节约运行时间,对于语句,应该将值为可能性比较高的变量写在前,而应该推后。</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;"><strong style="margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; color: rgb(119, 48, 152);">6.1 用for循环代替while循环</strong></p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">Python 的循环比循环快不少。</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;"><strong style="margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; color: rgb(119, 48, 152);">6.2 使用隐式for循环代替显式for循环</strong></p><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">针对上面的例子,更进一步可以用隐式循环来替代显式循环</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;"><strong style="margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; color: rgb(119, 48, 152);">6.3 减少内层for循环的计算</strong></p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">上面的代码中位于内侧循环, 每次训练过程中都会重新计算一次,增加了时间开销。</p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">我们沿用上面介绍过的例子,在此基础上使用。可以将 Python 函数 JIT 编译为机器码执行,大大提高代码运行速度。关于的更多信息见下面的主页:http://numba.pydata.org/numba.pydata.org<span style="margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; letter-spacing: 0.05em;"></span></p><pre style="margin-top: 10px; margin-bottom: 10px; padding: 0px; outline: 0px; max-width: 100%; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px; box-sizing: border-box !important; overflow-wrap: break-word !important;"></pre><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">Python 内置的数据结构如,&nbsp;,&nbsp;,&nbsp;,&nbsp;底层都是 C 实现的,速度非常快,自己实现新的数据结构想在性能上达到内置的速度几乎是不可能的。</p><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">类似于 C++ 中的,是一种动态数组。其会预分配一定内存空间,当预分配的内存空间用完,又继续向其中添加元素时,会申请一块更大的内存空间,然后将原有的所有元素都复制过去,之后销毁之前的内存空间,再插入新元素。</p><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">删除元素时操作类似,当已使用内存空间比预分配内存空间的一半还少时,会另外申请一块小内存,做一次元素复制,之后销毁原有大内存空间。</p><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">因此,如果有频繁的新增、删除操作,新增、删除的元素数量又很多时,list的效率不高。此时,应该考虑使用。是双端队列,同时具备栈和队列的特性,能够在两端进行 O(1) 复杂度的插入和删除操作。</p><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">的查找操作也非常耗时。当需要在频繁查找某些元素,或频繁有序访问这些元素时,可以使用维护对象有序并在其中进行二分查找,提升查找的效率。</p><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">另外一个常见需求是查找极小值或极大值,此时可以使用模块将转化为一个堆,使得获取最小值的时间复杂度是 O(1)<span style="margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; letter-spacing: 0.05em;">。</span></p><p style="margin: 1em 4px; padding: 8px 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; font-size: 16px; line-height: 26px; color: black;">下面的网页给出了常用的 Python 数据结构的各项操作的时间复杂度:https://wiki.python.org/moin/TimeComplexity</p><p><br/></p><p><br/></p>                                         





                                                 	<p><br/></p><p><br/></p><p><span style=";font-family:宋体;font-size:14px"><span style="font-family:宋体">字符串是</span><span style="font-family:Calibri">Python</span><span style="font-family:宋体">中最重要的数据结构,今天我们用一篇文章</span></span><span style=";font-family:宋体;font-size:14px"><span style="font-family:宋体">一起来学习</span></span><span style=";font-family:宋体;font-size:14px"><span style="font-family:Calibri">Python</span><span style="font-family:宋体">中的</span></span><span style=";font-family:宋体;font-size:14px"><span style="font-family:Calibri">4</span></span><span style=";font-family:宋体;font-size:14px"><span style="font-family:宋体">种字符串拼接方法。</span></span></p><p><span style=";font-family:宋体;font-size:14px"><span style="font-family:宋体">一、逗号连接</span></span></p><p><span style=";font-family:Calibri;font-size:14px"><span style="font-family:宋体">使用逗号形式要注意一点,就是只能用于</span>print<span style="font-family:宋体">打印</span></span><span style=";font-family:宋体;font-size:14px"><span style="font-family:宋体">。</span></span></p><p><span style=";font-family:宋体;font-size:14px"><span style="font-family:宋体">输出时,逗号会自占一个空格。</span></span></p><p><span style=";font-family:宋体;font-size:14px"><span style="font-family:宋体">二、加号连接</span></span></p><p><span style=";font-family:宋体;font-size:14px"><span style="font-family:宋体">这种方式最常用、直观、易懂,是入门级的实现方式。</span></span></p><p><span style=";font-family:宋体;font-size:14px"><span style="font-family:宋体">但是注意,数字不可以直接和字符串用</span><span style="font-family:Calibri">+</span><span style="font-family:宋体">号拼接,必须先将数字转换成字符串才能拼接。</span></span></p><p><span style=";font-family:Calibri;font-size:14px"><span style="font-family:宋体">当拼接的最终字符串长度不超过</span>20<span style="font-family:宋体">时,</span><span style="font-family:Calibri">+</span><span style="font-family:宋体">号操作符的方式,会比</span></span><span style=";font-family:宋体;font-size:14px"><span style="font-family:宋体">其它</span></span><span style=";font-family:Calibri;font-size:14px"><span style="font-family:宋体">方式快得多</span></span><span style=";font-family:宋体;font-size:14px"><span style="font-family:宋体">。</span></span></p><p><span style=";font-family:宋体;font-size:14px"><span style="font-family:宋体">三、</span><span style="font-family:Calibri">%</span><span style="font-family:宋体">方式</span></span></p><p><span style=";font-family:Calibri;font-size:14px">%<span style="font-family:宋体">号格式化字符串的方式继承自古老的</span><span style="font-family:Calibri">C</span><span style="font-family:宋体">语言,这在很多编程语言都有类似的实现。</span></span><span style=";font-family:宋体;font-size:14px"><span style="font-family:宋体">例如</span></span><span style=";font-family:Calibri;font-size:14px">%s<span style="font-family:宋体">是一个占位符,它仅代表一段字符串,并不是拼接的实际内容。实际的拼接内容在一个单独的</span><span style="font-family:Calibri">%</span><span style="font-family:宋体">号后面。</span></span></p><p><span style=";font-family:Calibri;font-size:14px"><span style="font-family:宋体">类似的占位符还有:</span>%d<span style="font-family:宋体">(代表一个整数)、</span><span style="font-family:Calibri">%f</span><span style="font-family:宋体">(代表一个浮点数)、</span><span style="font-family:Calibri">%x</span><span style="font-family:宋体">(代表一个</span><span style="font-family:Calibri">16</span><span style="font-family:宋体">进制数),等等。</span><span style="font-family:Calibri">%</span><span style="font-family:宋体">占位符既是这种拼接方式的特点,同时也是其限制,因为每种占位符都有特定意义,实际使用起来太麻烦了。</span></span></p><p><span style=";font-family:宋体;font-size:14px"><span style="font-family:宋体">四、</span><span style="font-family:Calibri">*</span><span style="font-family:宋体">方式</span></span></p><p><span style=";font-family:宋体;font-size:14px">&nbsp;</span><img src="http://zjh-space.oss-cn-hangzhou.aliyuncs.com/space/post/330683/2021/09/18/61454f5be4732/1631932251_9356_47933.png" title="" alt="image.png"/></p>

讯享网
小讯
上一篇 2025-06-07 20:11
下一篇 2025-05-31 10:11

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/149842.html