53DEi3与i5的性能差多少能

李沐大神说过,深度学习框架就是丹炉.&br&&ol&&li&google丹炉的使用说明书:确实是很完善,从最开始出来到现在一直在更新,有段时间不看文档,发现对了好多contrib的文档内容(这个特别棒,建议持续关注),所以,所以一直要持续的关注/学习;&/li&&li&炼丹友的反馈:做实验用第三方框架 tflearn, tensorlayer都很好,不过个人感觉还是要先猜猜原生tensorflow源码的坑,所以在github上,watch tensorflow这个项目是必须的,尤其是没事看看别人提的issue,很多时候会避免在之后你用到的问题;&/li&&li&定位自己的方向:就是你做的这块的内容在tensorflow的体现,比如本人做cv的,会去关注tensorflow/model下的各种cv方向的&a href=&///?target=https%3A///tensorflow/models& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&tensorflow/models&i class=&icon-external&&&/i&&/a&,会去读它的代码实现,google的工程实现确实很厉害,代码很完善,看着很漂亮,是种享受,还有就是github其他的基于tensorflow的cv下的内容,挑star高的去看下,过不了多久,你就会慢慢模仿着用来写自己的model,而且会显得很专业;&/li&&li&关注丹方: TensorFlow就是一套工具,无论是mxnet、torch、paddle,真正我们要做的是用某套工具把我们熟悉,了解的丹方炼出来,google model下&a href=&///?target=https%3A///tensorflow/models/tree/master/slim/nets& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&tensorflow/models&i class=&icon-external&&&/i&&/a&里面很最新的image下的丹方,建议多熟悉熟悉,如果发现其他框架比如tflearn,tensorlayer,mxnet上没有的可以去尝试用别的丹炉炼出来,这个很有用的,本人用tflearn写过googlenet,inception-resnet-v2,用mxnet写过inception-resnet-v2,难度不大但你会学到从头到尾去熟悉丹炉;&/li&&li&第三方支持框架: tensorflow出来后有很多高级的第三方包,例如tflearn,keras,tensorlayer,提供高级的api用来快速实现某些功能,但是我觉得更大的好处其实不是快速写好某个模型,而是其内部专业的高级api的代码实现,极其值得参考,本人比较熟悉tflearn,tflearn里面的各种layer的写法简直是教科书级别的,童靴们在写tensorflow源码的时候完全可以拿来参考&/li&&li&金丹使用: model训练出来,如何使用?做inference还是保存下来对新的task做pretrained+fine-tuning,这些都要关注,具体可以去看看例如neural style的model还有一些图像分类比赛使用pretrained model的源码;&/li&&li&框架底层的学习: 本人在这块不熟悉,但是个人觉得还是很有必要掌握这些,我之后会在一段时间好好关注下这部分,读读轻量级框架&a href=&///?target=https%3A///pjreddie/darknet& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&pjreddie/darknet&i class=&icon-external&&&/i&&/a&,&a href=&///?target=https%3A///tiny-dnn/tiny-dnn& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&tiny-dnn/tiny-dnn&i class=&icon-external&&&/i&&/a&的源码&/li&&/ol&最后不要脸地推荐下我博客的几篇相关文章:&br&&a href=&///?target=http%3A///%3Fp%3D1639& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TensorFlow入门一-小石头的码疯窝&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///%3Fp%3D1651& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TensorFlow之深入理解Neural Style&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///%3Fp%3D1661& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TensorFlow之深入理解AlexNet-小石头的码疯窝&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///%3Fp%3D1678& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TensoFlow之深入理解GoogLeNet-小石头的码疯窝&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///%3Fp%3D1690& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TensorFlow之深入理解VGG\Residual Network&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///%3Fp%3D1693& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TensorFlow之深入理解Fast Neural Style&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///%3Fp%3D1726& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&风格画之最后一弹MRF-CNN-小石头的码疯窝&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///%3Fp%3D1730& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深度学习之Neural Image Caption&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///%3Fp%3D1733& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MXnet初体验之inception-resnet-v2从Model到Predict-小石头的码疯窝&i class=&icon-external&&&/i&&/a&
李沐大神说过,深度学习框架就是丹炉. google丹炉的使用说明书:确实是很完善,从最开始出来到现在一直在更新,有段时间不看文档,发现对了好多contrib的文档内容(这个特别棒,建议持续关注),所以,所以一直要持续的关注/学习;炼丹友的反馈:做实验用第…
&img src=&/v2-8baf09aec69_b.jpg& data-rawwidth=&1300& data-rawheight=&867& class=&origin_image zh-lightbox-thumb& width=&1300& data-original=&/v2-8baf09aec69_r.jpg&&&p&Sophia是CMU 统计专业的硕士毕业生,现就职于Amazon,做Data Scientist。一起来听听她的求职故事。&img src=&/v2-afdc6230003afdaf85c11c955f6efbad_b.jpg& data-rawwidth=&748& data-rawheight=&330& class=&origin_image zh-lightbox-thumb& width=&748& data-original=&/v2-afdc6230003afdaf85c11c955f6efbad_r.jpg&&&/p&&b&小编:可以大概介绍一下Data相关面试的时候都大概考些什么吗?&/b&&p&Sophia:根据我的经验,大概可以分成:SQL, 统计相关,business case和behavior questions。统计方面一般涉及的是基本概念,例如有missing data的常用处理方法。&/p&&p&&b&小编:可以具体讲讲business case方面的面试问题怎么准备吗?&/b&&/p&&p&Sophia:我个人觉得这个挺难准备的,我会从Glassdoor上看一些题。建议大家平时多思考一些问题,看一些blog。&/p&&p&&b&小编:听很多朋友介绍经验,machine learing方面也是面试热点。这方面你感觉知识点常考什么呢?&/b&&/p&&p&Sophia: 机器学习方面确实是个热点。我印象中面过一些基本概念,比如logistic regression和random forest。还会考regularization,和feature selection的方法。&/p&&p&&b&小编:你在找工作的时候,都面过哪些公司呀?是什么职位呢?&/b&&/p&&p&Sophia: 我是去年找的工作,当时就投了Amazon一家。我当时是Data Scientist和Data Analyst混着面的。感觉在面试的时候不要因为title把自己局限住,像Seattle的很多职位都可以面。&/p&&p&&b&小编:你在进入Amazon前有没有别的工业界的工作经验呀?&/b&&/p&&p&Sophia:我之前在Ohio的一家公司汽车保险类公司做过Research & Development Analyst。在Ohio那个工作每周需要加班一天,时间上来说我一般是9点到公司,6点下班回家。工作量还是蛮大的,有的时候需要同时做4到5个projects。我觉得在那里将近一年的工作教会了我business thinking的方式,比如怎么挣钱,怎么省钱。&/p&&p&&b&小编:很多读者可能会对你们这个行业的薪资感兴趣,可以透露一些你知道的信息吗?&/b&&/p&&p&Sophia:如果是Data Scientist,起薪一般是10万。如果是Analyst,以我知道的CMU毕业的同学为例,收入和工作地点相关联。芝加哥的年薪7万多,纽约8-9万,加州这边的公司起薪有可以给到10万的。&img src=&/v2-54bcbf7a046eabf5828d_b.jpg& data-rawwidth=&623& data-rawheight=&231& class=&origin_image zh-lightbox-thumb& width=&623& data-original=&/v2-54bcbf7a046eabf5828d_r.jpg&&&/p&&p&&b&小编:现在咱们再聊聊你面试Amazon的时候的经历吧。可以分享一下大致是什么样的流程吗?&/b&&/p&&p&Sophia:我面Amazon的Data Scientist职位的时候,先是经历了两轮电面。这两轮电面我被问到了SQL和统计方面的知识,我感觉具体被问到什么会和面试人自己的背景有关。然后拿到onsite后有6轮面试。第一轮是behavior面试,第二轮是和组里的人吃午餐,后面四轮都是技术相关的。最后这个四轮的环节,据我了解如果是CS的就会考算法,比较难。如果是统计或者Business相关专业的就不用考特别难得编程,一般都是偏简单的,比如R和Python入门级的水平。&/p&&p&&b&小编:Data Engineering这个方面,你觉得在学生时候学到的再工作中很实用吗?&/b&&/p&&p&Sophia:我在上学的时候学过一些Hadoop,基本概念我都知道,但是目前在工作中还没有用到。Mapreduce的话,在工作中我写过一些common mapreduce job。&/p&&p&&b&小编:可以分享一下你在Amazon入职后的工作感受吗?&/b&&/p&&p&Sophia:我入职Amazon的时间不长,公司没有对新人的training,上来就干活,和我想象的不太一样。可能公司的文化就是这样吧,有一些document可以去读。&/p&&p&我在Amazon的Payment组,主要做customer acquisition & target,focus在payment product。&img src=&/v2-53decbab1cdc1df6a291_b.png& data-rawwidth=&1200& data-rawheight=&537& class=&origin_image zh-lightbox-thumb& width=&1200& data-original=&/v2-53decbab1cdc1df6a291_r.png&&&/p&&p&&b&小编:你们组里的人是new grad的有多少呢?&/b&&/p&&p&Sophia:我们组里的人有两个是new grad进来的,有一个是之前的拿到return offer的intern。其他人都是experienced。&/p&&p&&b&小编:就大家的学术背景来看,做Data Scientist最好是PhD背景吗?你们组里PhD的比例是多少呀?&/b&&/p&&p&Sophia: 如果是搞算法的话就需要是PhD,如果是support business product的就未必要求一定是PhD,就我们组来说的话20%做customer product的是PhD。据我了解,CS,同届和Engineering背景的人都有。&/p&&br&&p&&img src=&/v2-ed39f5b29e497d95ded3477_b.jpg& data-rawwidth=&2000& data-rawheight=&1330& class=&origin_image zh-lightbox-thumb& width=&2000& data-original=&/v2-ed39f5b29e497d95ded3477_r.jpg&&最后,欢迎各位小伙伴加入&b&“北美秋季Data方向申请”QQ&/b&&b&群&/b&:&/p&&p&关注&b&“DataOffer”微信公众账号&/b&获取更多干货和最新信息:dataoffer&/p&&p&对DATAOFFERS感兴趣的朋友可以联系:elaine@bittiger.io&/p&&br&&p&本文作者:Elaine&/p&&p&著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。&/p&
Sophia是CMU 统计专业的硕士毕业生,现就职于Amazon,做Data Scientist。一起来听听她的求职故事。小编:可以大概介绍一下Data相关面试的时候都大概考些什么吗?Sophia:根据我的经验,大概可以分成:SQL, 统计相关,business case和behavior questions。…
&img src=&/v2-f11f49e45bb26ccaa5f7_b.png& data-rawwidth=&578& data-rawheight=&272& class=&origin_image zh-lightbox-thumb& width=&578& data-original=&/v2-f11f49e45bb26ccaa5f7_r.png&&&p&继续前面有关于的Python面试的两篇内容:&a class=&internal& href=&/p/?refer=passer&&Python代码篇&/a&
、&a class=&internal& href=&/p/?refer=passer&&Python概念篇&/a& 今天说一说数据库。不管你是Java开发者还是Python开发者还是其他语言开发者,基本上面试的时候都会被问到数据库相关的知识点。所以掌握一些经常被问的数据库知识是十分重要的。&/p&&p&如果你对数据库不熟悉,想学习的话,学习专栏有一篇&a class=&internal& href=&/p/?refer=passer&&MySQL学习资料&/a&&/p&&p&那么常见的数据库面试题有哪些呢?&b&(非DBA向)&/b&&/p&&p&&img data-rawheight=&272& data-rawwidth=&578& src=&/v2-f11f49e45bb26ccaa5f7_b.png& class=&origin_image zh-lightbox-thumb& width=&578& data-original=&/v2-f11f49e45bb26ccaa5f7_r.png&&(一)什么是存储过程?有哪些优缺点?&/p&&p&存储过程是一些预编译的SQL语句。&/p&&p&更加直白的理解:存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。&/p&&ul&&li&存储过程是一个预编译的代码块,执行效率比较高&/li&&li&一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率&/li&&li&可以一定程度上确保数据安全&br&&/li&&/ul&&p&如果你对存储过程不熟悉,建议阅读:&a class=& wrap external& href=&/?target=http%3A///knowledgesea/archive//2841588.html& target=&_blank& rel=&nofollow noreferrer&&存储过程详解-博客园&i class=&icon-external&&&/i&&/a&&/p&&p&(二)索引是什么?有什么作用以及优缺点?&/p&&p&索引是对数据库表中一或多个列的值进行排序的结构,是帮助MySQL高效获取数据的数据结构&/p&&p&你也可以这样理解:索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。 &/p&&p&&b&MySQL&/b&数据库几个基本的索引类型:普通索引、唯一索引、主键索引、全文索引&/p&&ul&&li&索引加快数据库的检索速度&/li&&li&索引降低了插入、删除、修改等维护任务的速度&/li&&li&唯一索引可以确保每一行数据的唯一性&/li&&li&通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能&/li&&li&索引需要占物理和数据空间 &br&&/li&&/ul&&p&如果你对索引还不太熟悉,建议阅读:&a class=& wrap external& href=&/?target=http%3A///page/45712/& target=&_blank& rel=&nofollow noreferrer&&漫谈数据库索引&i class=&icon-external&&&/i&&/a&&/p&&p&(三)什么是事务?&/p&&p&事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。&/p&&p&如果你对索引还不太熟悉,建议阅读:&a class=& wrap external& href=&/?target=http%3A//blog.csdn.net/zdwzzu2006/article/details/5947062& target=&_blank& rel=&nofollow noreferrer&&数据库事务 -
Mr. David 专栏&i class=&icon-external&&&/i&&/a&&/p&&p&(四)数据库的乐观锁和悲观锁是什么?&br&&/p&&p&数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。
&/p&&p&乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。&/p&&ul&&li&悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作&/li&&li&乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。&/li&&/ul&&p&如果你对两种锁还不太熟悉,建议阅读:&a class=& wrap external& href=&/?target=http%3A//www./lib/view/open5.html& target=&_blank& rel=&nofollow noreferrer&&深入理解乐观锁与悲观锁&i class=&icon-external&&&/i&&/a&&br&&/p&&p& (五) 使用索引查询一定能提高查询的性能吗?为什么&/p&&p&通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价.&/p&&p&索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改.
这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O.
因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能,索引范围查询(INDEX
RANGE SCAN)适用于两种情况:&/p&&ul&&li&基于一个范围的检索,一般查询返回结果集小于表中记录数的30%&/li&&li&基于非唯一性索引的检索&/li&&/ul&&p&(六)简单说一说&b&drop、delete&/b&与&b&truncate&/b&的区别&/p&&p&SQL中的&b&drop、delete、truncate&/b&都表示删除,但是三者有一些差别
&/p&&ul&&li&&b&delete和truncate&/b&只删除表的数据不删除表的结构&/li&&li&速度,一般来说:&b& drop& truncate &delete &/b&&br&&/li&&li&&b&delete&/b&语句是dml,这个操作会放到&b&rollback segement&/b&中,事务提交之后才生效;&br&如果有相应的&b&trigger&/b&,执行的时候将被触发. &b&
truncate,drop&/b&是ddl, 操作立即生效,原数据不放到r&b&ollback segment&/b&中,不能回滚. 操作不触发&b&trigger&/b&.
&br&&/li&&/ul&&p&如果你对这三者的用法还不太熟悉,建议阅读:&a class=& wrap external& href=&/?target=http%3A//blog.csdn.net/ws0513/article/details/& target=&_blank& rel=&nofollow noreferrer&& drop、truncate和delete的区别 &i class=&icon-external&&&/i&&/a&&/p&&p&(七)&b&drop、delete&/b&与&b&truncate&/b&分别在什么场景之下使用?&/p&&ul&&li&不再需要一张表的时候,用&b&drop&/b&&/li&&li&想删除部分数据行时候,用&b&delete&/b&,并且带上where子句&/li&&li&保留表而删除所有数据的时候用&b&truncate&/b&&/li&&/ul&&p&(八) 超键、候选键、主键、外键分别是什么?&/p&&p&超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。&/p&&p&候选键:是最小超键,即没有冗余元素的超键。&/p&&p&主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。&/p&&p&外键:在一个表中存在的另一个表的主键称此表的外键。&/p&&p&(九)什么是视图?以及视图的使用场景有哪些?&/p&&p&视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。&/p&&ul&&li&只暴露部分字段给访问者,所以就建一个虚表,就是视图。&/li&&li&查询的数据来源于不同的表,而查询者希望以统一的方式查询,这样也可以建立一个视图,把多个表查询结果联合起来,查询者只需要直接从视图中获取数据,不必考虑数据来源于不同表所带来的差异
&/li&&/ul&&p&(十)说一说三个范式。&/p&&p&第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。&/p&第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如
果存在&A → B → C&的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系: 关键字段 → 非关键字段
x → 非关键字段y &/p&&p&如果你对三个还不太了解,建议阅读:&a class=&internal& href=&/question/&&解释一下关系数据库的第一第二第三范式?&/a&&br&&/p&&p&本文参考文献文章: &br&&/p&&p&「1」&a class=& wrap external& href=&/?target=http%3A///85231/& target=&_blank& rel=&nofollow noreferrer&&很全的Python面试题&i class=&icon-external&&&/i&&/a&&/p&&p&「2」&a class=& wrap external& href=&/?target=http%3A//blog.csdn.net/hectorhua/article/details/& target=&_blank& rel=&nofollow noreferrer&&数据库常见笔试面试题 &i class=&icon-external&&&/i&&/a&&/p&&p&「3」&a class=& wrap external& href=&/?target=http%3A///king1302217/archive//1732250.html& target=&_blank& rel=&nofollow noreferrer&&数据库索引&i class=&icon-external&&&/i&&/a&&/p&&p&「4」&a class=& wrap external& href=&/?target=http%3A//blog.csdn.net/hectorhua/article/details/& target=&_blank& rel=&nofollow noreferrer&&数据库常见笔试面试题
Hectorhua的专栏&i class=&icon-external&&&/i&&/a&&/p&&p&「5」&a class=& wrap external& href=&/?target=http%3A//blog.chinaunix.net/uid--id-3259822.html& target=&_blank& rel=&nofollow noreferrer&& SQL 中 drop 、delete 和truncate 的区别&i class=&icon-external&&&/i&&/a&&/p&&p&「6」&a class=& wrap external& href=&/?target=http%3A//www.jb51.net/article/80800.htm& target=&_blank& rel=&nofollow noreferrer&&数据库基本概念面试必问&i class=&icon-external&&&/i&&/a&&/p&&br&&b&学习编程,欢迎关注专栏:&a href=&/passer& class=&internal&&学习编程 - 知乎专栏&/a&&/b&
继续前面有关于的Python面试的两篇内容: 、 今天说一说数据库。不管你是Java开发者还是Python开发者还是其他语言开发者,基本上面试的时候都会被问到数据库相关的知识点。所以掌握一些经常被问的数据库知识是十分重要的。如果你对…
&img src=&/v2-297f8b4ddaeaa12b512c5eb32fb6341c_b.png& data-rawwidth=&656& data-rawheight=&294& class=&origin_image zh-lightbox-thumb& width=&656& data-original=&/v2-297f8b4ddaeaa12b512c5eb32fb6341c_r.png&&&p&希望此文可以长期更新并作为一篇Python的面试宝典。每一道题目都附有详细解答,以及更加详细的回答链接。此篇是代码篇,上一篇是:&a class=&internal& href=&/p/?refer=passer&&Python概念篇 &/a&两者结合效果更佳。
&/p&&p&喜欢听音乐的猿们,欢迎关注我最近新开的专栏:&a class=&internal& href=&/listen&&音乐推荐-知乎专栏&/a&&br&&/p&&p&&img data-rawheight=&294& data-rawwidth=&656& src=&/v2-297f8b4ddaeaa12b512c5eb32fb6341c_b.png& class=&origin_image zh-lightbox-thumb& width=&656& data-original=&/v2-297f8b4ddaeaa12b512c5eb32fb6341c_r.png&&(一)、如何反序的迭代一个序列?&/p&&p&&img data-rawheight=&354& data-rawwidth=&519& src=&/v2-18dfdfdafd765_b.png& class=&origin_image zh-lightbox-thumb& width=&519& data-original=&/v2-18dfdfdafd765_r.png&&(二)、 如何用Python来进行查询和替换一个文本字符串?&/p&&p&&img data-rawheight=&289& data-rawwidth=&730& src=&/v2-c7efe5fb9b8ed0ba606782aace195117_b.png& class=&origin_image zh-lightbox-thumb& width=&730& data-original=&/v2-c7efe5fb9b8ed0ba606782aace195117_r.png&&(三)、使用Python实现单例模式。&/p&&p&所谓单例就是一个类从始至终只能产生一个实例。&/p&&p&方法一:使用&b&__new__&/b&方法&/p&&p&在&b&__new__&/b&方法中把类实例绑定到类变量&b&_instance&/b&上,如果&b&cls._instance&/b&为&b&None&/b&表示该类还没有实例化过,实例化该类并返回。如果&b&cls_instance&/b&不为&b&None&/b&表示该类已实例化,直接返回&b&cls_instance&/b&&/p&&img data-rawheight=&503& data-rawwidth=&768& src=&/v2-ef8f476aeeb94b7ff43bf75_b.png& class=&origin_image zh-lightbox-thumb& width=&768& data-original=&/v2-ef8f476aeeb94b7ff43bf75_r.png&&&p&方法二:使用装饰器&b&(decorator)&/b&&/p&&p&&img data-rawheight=&526& data-rawwidth=&616& src=&/v2-1e3fb4ae8d3bac0e80dc670_b.png& class=&origin_image zh-lightbox-thumb& width=&616& data-original=&/v2-1e3fb4ae8d3bac0e80dc670_r.png&& 方法三:使用&b&__metaclass__&/b&(元类)&img data-rawheight=&479& data-rawwidth=&876& src=&/v2-749854eda89f7ec68a1d18cb8af319fb_b.png& class=&origin_image zh-lightbox-thumb& width=&876& data-original=&/v2-749854eda89f7ec68a1d18cb8af319fb_r.png&&&/p&&p&方法四:共享属性&/p&&p&所谓单例就是所有的引用(实例,对象)拥有相同的属性和方法,同一个类的实例天生都会有相同的方法,那我们只需要保证同一个类所产生的实例都具有相同的属性。所有实例共享属性最简单直接的方法就是共享&b&__dict__&/b&属性指向。&/p&&img data-rawheight=&535& data-rawwidth=&617& src=&/v2-b4b7fe9c82ec6fdd86f8f1e93e125751_b.png& class=&origin_image zh-lightbox-thumb& width=&617& data-original=&/v2-b4b7fe9c82ec6fdd86f8f1e93e125751_r.png&&&p&方法五:Python模板&/p&&p&&img data-rawheight=&212& data-rawwidth=&410& src=&/v2-e44aee8bb6ccac3faeb0adffd5387483_b.png& class=&content_image& width=&410&& (四)、重新实现str.strip(),注意不能使用string.*strip()&/p&&p&&img data-rawheight=&506& data-rawwidth=&727& src=&/v2-253b18f0acd_b.png& class=&origin_image zh-lightbox-thumb& width=&727& data-original=&/v2-253b18f0acd_r.png&&(五)、 阅读下面的代码,它的输出结果是什么?(&b&super&/b&)&/p&&p&&img data-rawheight=&543& data-rawwidth=&683& src=&/v2-9d4cc1a5b51bed1aaabff3a_b.png& class=&origin_image zh-lightbox-thumb& width=&683& data-original=&/v2-9d4cc1a5b51bed1aaabff3a_r.png&&想要更佳详细的了解有关于&b&super&/b&,点击这里:&a href=&/?target=http%3A///lovemo1314/archive//2035005.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&python super() - 漩涡鸣人 - 博客园&i class=&icon-external&&&/i&&/a&&br&&/p&&p&(六)、Python的函数参数传递&/p&&p&&img data-rawheight=&311& data-rawwidth=&246& src=&/v2-719bb6fba27b150e_b.png& class=&content_image& width=&246&&关于以上代码:&b&Python&/b&中&b&string、tuple、number&/b&属于不可更改对象,而&b&list&/b&和&b&dict&/b&属于可修改对象。&/p&&p&(七)、类变量和实例变量&/p&&p& 类变量就是供给类使用的变量,实例变量就是供给实例使用的变量。看以下代码&/p&&ul&&li&上半部分:&b&name&/b&是字符串(不可更改对象),实例变量&b&p1.name&/b&一开始指向了类变量&b&name=&aaa&&/b&,但是在实例的作用域把类变量的引用改变了,就变成了一个实例变量&b&self.name&/b&不再引用&b&Person&/b&的类变量&b&name &/b&&/li&&li&下班部分:&b&name&/b&是&b&list&/b&(可更改对象)&/li&&/ul&&p&&img data-rawheight=&553& data-rawwidth=&420& src=&/v2-cdf220325fff67ffca56aa_b.png& class=&content_image& width=&420&&(八)、Python在函数式编程方面的支持。&/p&&p&方面一:&b&lambda&/b&表达式:体现原理就是&b&python&/b&允许&b&lambda&/b&关键字创建匿名函数,所谓匿名就是&b&python&/b&不会创建名称空间,&b&lambda&/b&表达式返回可调用的函数对象,这些都符合函数式编程的思想。&/p&&p&方面二:内建函数:&b&filter()、reduce()、map() &/b&&/p&&p&&img data-rawheight=&190& data-rawwidth=&548& src=&/v2-e0f3dcb7cc3b2d9f1445_b.png& class=&origin_image zh-lightbox-thumb& width=&548& data-original=&/v2-e0f3dcb7cc3b2d9f1445_r.png&&有关于三个内建函数的详细解答,请点击这里:&a class=& wrap external& href=&/?target=http%3A///BeginMan/p/3509985.html& target=&_blank& rel=&nofollow noreferrer&&Python 函数式编程 - BeginMan - 博客园&i class=&icon-external&&&/i&&/a&&br&&/p&&p&(九)、 以下代码将输出什么?(考察&b&list&/b&)&/p&&p&&img data-rawheight=&118& data-rawwidth=&307& src=&/v2-b0e0a3b5ab9_b.png& class=&content_image& width=&307&&可能你会问:why?为什么它没有报错:是的,它不会报错。试图访问一个列表的以超出列表成员数作为开始索引的切片将不会导致&b&IndexError&/b&,并且仅仅返回一个空&b&list&/b&&/p&&p&(十)、 以下代码将输出什么?(考察)&/p&&p&&img data-rawheight=&260& data-rawwidth=&542& src=&/v2-3de52a73ace8_b.png& class=&origin_image zh-lightbox-thumb& width=&542& data-original=&/v2-3de52a73ace8_r.png&&这个原因是Python的闭包的后期绑定导致的&b&late binding&/b&。这意味着在闭包中的变量是在内部函数被调用的时候被查找。所以结果是,当任何的&b&testFun()&/b&返回的函数被调用,在那时,i的值是在它被调用时的周围作用域中查找,到那时,无论哪个返回的函数被调用,for循环已经完成,i的最后值是3,因此每个返回的函数&b&testFun&/b&的值都是3。&/p&&p&更详细的解答可以看这里:&a href=&/question/& class=&internal&&Python中后期绑定(late binding)是什么意思?&/a&&br&&/p&&p&本文参考文献资料:&/p&&p&「1」&a class=& wrap external& href=&/?target=http%3A//blog.csdn.net/alvine008/article/details/& target=&_blank& rel=&nofollow noreferrer&&七、PYTHON 一些基础面试题目总结&i class=&icon-external&&&/i&&/a&&/p&&p&「2」&a class=& wrap external& href=&/?target=http%3A///blog/1562618& target=&_blank& rel=&nofollow noreferrer&&Python单例模式的4种实现方法&i class=&icon-external&&&/i&&/a&&/p&&p&「3」&a class=& wrap external& href=&/?target=http%3A//blog.csdn.net/soft_lawrency/article/details/8638360& target=&_blank& rel=&nofollow noreferrer&&python 面试题 - 知识点整理&i class=&icon-external&&&/i&&/a&&/p&&p&「4」&a class=& wrap external& href=&/?target=http%3A///85231/& target=&_blank& rel=&nofollow noreferrer&&很全的 Python 面试题 - Python - 伯乐在线&i class=&icon-external&&&/i&&/a&&/p&&p&「5」&a class=& wrap external& href=&/?target=http%3A///BeginMan/p/3509985.html& target=&_blank& rel=&nofollow noreferrer&&Python 函数式编程 - BeginMan - 博客园&i class=&icon-external&&&/i&&/a&&/p&&br&&b&学习编程,欢迎关注专栏:&a href=&/passer& class=&internal&&学习编程 - 知乎专栏&/a&&/b&
希望此文可以长期更新并作为一篇Python的面试宝典。每一道题目都附有详细解答,以及更加详细的回答链接。此篇是代码篇,上一篇是:两者结合效果更佳。 喜欢听音乐的猿们,欢迎关注我最近新开的专栏: (一)、如何反序的迭代…
声明,本文不止适用于此题,大部分的简历、面试都可以参考这个回答。因为没找到合适的题目放这个回答,所以放到这里。&br&&br&因为从大二开始就帮助公司(阿里)做推荐,所以在简历方面还算有一些经验:我可能没法直接做出一份出色的简历,但是我知道能帮助你避免哪些问题;同样的,对于面试也有一些经验,可以谈一谈。至于笔试...没什么可说的...我怎么知道你的岗位(除了CS方向我可能知道一点)笔试考什么?&br&&br&
阅读提要:本文从&b&简历&/b&、&b&邮件&/b&和&b&面试&/b&几部分进行了回答。&br&&br&写在前面:最近不断地有人问我,如何准备简历,如何准备面试,面试会问什么等问题。对于这些问题,我想统一整理到我下面这个答案中,以免很多点我不断重复。希望能帮助到大家。&br&&br&另外,请避免问我以下问题:xx公司的面试都问什么啊?难不难?我能不能拿到offer?等。因为这类问题,我真的回答不上...我不知道你的能力,不知道你准备到什么程度,同样我也不知道面试官会怎么问...最重要的是,这类问题取决于你本身的实力,对于大部分人来讲,想靠忽悠进入一下好的公司还是不现实的。&br&&br&=================================正文=================================&br&&b&第一部分:&/b&&b&简历&/b&&br&&br&
首先,一份好的简历一定要包括足够的个人信息:姓名、学校、电话、电子邮箱等。信息足够到:一定能联系到你并且知道你是否是应届生。关于照片,我的官腔:其实加不加是无所谓的事情。我的真实回答:看脸。&br&&br&下面是我建议的内容安排顺序和具体项目的一些warning(引用了我另一个问题中的答案,有大改):&br&&br&&b&教育背景&/b&:大学以来的学校、专业以及成绩、排名等。&br&&br&&b&&i&意向岗位&/i&&/b&:一定要有,不然HR要去猜你投的哪个岗位或者再去邮件查看?一定要注意,一些细节比如说,让看你的简历的人舒服、不必要做多余的举动是很重要的。另外提醒一下新手常犯错误,不要申请不同方向的两个岗位。想想收到简历的人会产生什么想法?&br&&br&&b&&i&荣誉&/i&&/b&:把这个放在前面因为好的荣誉会很大程度加深看简历的人对你的印象。不过只有一些诸如三好学生之类的荣誉,这一项写不写都行;非要写的话顺序还是往后放一放吧。&br&&br&&b&&i&项目&/i&&/b&:项目也一定靠前列出。不过和上面的一样,优质项目靠前。如何评判优质项目?首先,项目具有一定的技术门槛;其次,本人应在这个项目中扮演重要角色,不然再牛的项目也不要靠前;最后,尽量不要把课设写在简历上!除非课设的项目你在实现的时候真的用了些很牛的方法!我看过很多简历,为了凑项目,把各种课设or实验放上去:xx管理系统、编译原理实验-语法分析器、小型数据库等。说真的,不知道罢了,知道这些就是课设或者实验的话,起码不是加分项。如果实在没有的话,那就写写自己实现过的,一些课程之外的小东西也好。这起码能凸显出个人兴趣和一定意义下的自学能力。&br&所以项目这一栏的内容是:项目名称(可包含简介),项目时间,你的角色以及你做的事情。不要长篇大论,简要概括即可。&br&&br&&b&&i&技术特长or专业技能&/i&&/b&:这个地方非常重要。如果说前面两项是敲门砖和加分项(放到前面是为了让人印象深刻),那么这一项有可能成为面试的核心!结合着一个很关键的问题来谈一谈。&br&&br&-------------下面这段话不止适用本项内容,同样适用于面试---------------&br&&br&简历的核心词其实应该是:&b&可控&/b&(or受控),受你的控制。&br&
面试官除了直接问技术问题之外,一切问题都是围绕着你呈献给他的这个简历的内容上(即使技术问题也是与意向职位和简历上写的商专业技能有关)。简历的主人,应该对简历的全部内容可控,体现在:&br&&br&1.&u&&b&熟悉写在简历上的项目&/b&&/u&。想象一下你写了个打酱油的看似很牛逼的项目,结果面试官拿着简历问你的时候,你是说实话然后面试官很不爽的说那你写在上面干嘛,还是说假话然后被睿智的面试官戳穿之后臭骂一顿?&br&&br&2. &b&&u&用词&/u&&/b&。在写专业技能的时候,很多人常犯的一个错误是:用词过大。这是文雅的说法,简单粗暴的说法是“吹牛逼”。校招的参与者是学生,所以说实话,不排除真的有很牛的人在某一项或者某几项的技能上达到了“精通”,但是真实的情况是:你平时用得再多的语言很可能也是“熟悉”。所以,我的建议是:对于自己最熟悉的技能or领域,写“熟悉”;其他用过的语言或者学习过的课程(没有深入自己凭借兴趣学习的),写“了解”就好。如果只是学了一门“数据库”课,千万不要为了显得自己牛而写上&精通&。而这次,不像上面“项目”一项中提到的,这个可一点撒谎的机会都没有,面试官问几个问题就一定会戳穿你的谎言!然后让你死的很惨(除非你在其它方面的出色抹掉了这个负分项)。&br&
另外,用小词的一个好处是:如果你真的不会,因为没有吹牛,回答问题的时候再谦虚一点+实话实说,面试官并不会为难你,起码不会扣分;而如果你发挥得很好,面试官可能会觉得惊喜:哇,不错嘛,还挺谦虚稳重的。&br&&br&3. &b&&u&不要贪求全面&/u&&/b&,将学过的全部课程或者语言写上去,没必要。而且这给了面试官发问的机会。为什么?因为面试官如果状态不好、不知道问什么的时候,你的课程一摆,给了他随意问的机会。你能保证这些课程是你都学得好的?or仅仅学过的?&br&
关键还是:可控。你一定要对你简历上的全部内容可控,你熟悉简历上的一切。所以列课程,可以,但是请只列出你熟悉的高分核心课程。&br&&br&&br&&b&&i&社会活动经历&/i&&/b&:正常的社团等经历写上去就行。名称、职位、做了哪些突出事迹等。&br&&br&&b&&i&其他&/i&&/b&:证书、兴趣爱好(比如擅长某项乐器或者运动等),列上即可。自我评价不建议放,真的没意义。&br&&br&
当然,如果你的真的没什么可写的,比如“熟悉”的技能和高度参与的项目,那么...先练好一门功夫再出来参加招聘。什么都没得写的简历不在本文的讨论范畴~&br&&br&&b&第二部分:&/b&&b&邮件&/b&&br&&br&写完简历,是要发送简历求推荐了。&br&*补充一下:如果是招聘网站,如拉勾,或者公司招聘入口,需要你填写个人电子简历。可能不需要邮件投递简历这样的事情。&br&这里简要说一下:邮件这件事,可以扩展很长,知乎已经有很干货的答案了。所以只做提醒。&br&&br&邮箱:QQ邮箱没问题,什么邮箱都没问题。但是请把你的邮箱发送者的名字改一下,改成本人姓名,谢谢。&br&标题比如:xx学校-xx专业-xxx简历-xx岗位&br&附件的简历名称同上。&br&正文:这种邮件正文不需要写太多。但是起码要有:称呼(您好就行),内容(我想应聘贵公司的xx部门的xx岗位一职,可否麻烦您给推荐/审查一下),结尾(Best, xxx)。这样就可以了。&br&&br&主要词就是:&b&礼貌&/b&和&b&细节&/b&。&br&&br&强调两点:部门和岗位。&br&
部门:如果可以,比如你要给我发送简历投递阿里,请添加你想去的部门。或许你可能不太清楚,但是你一定可以在网上查到信息的。最起码,列出2-3个候选部门也是可以的。&br&
岗位:我们在推荐的时候,招聘的相关信息是一定放在网站上的。所以你一定能找到相关的岗位&b&名称&/b&和&b&描述&/b&。不要搞错岗位名称,我一定会觉得你连这点事情都能搞错,那就算了吧。更不要让别人帮助你觉得职位(甚至部门)。你才是最了解你的能力和想法的人,你也应该对自己负责。我可以帮你随便投递一个岗位,但是我觉得这样做,对你对我都不好。&br&&br&&b&第三部分:面试&/b&&br&&br&面试可能是大家最关心的。但是说起来,面试其实可说的不多。因为到这里,不同的行业、岗位的面试考察方式都不一样。不过虽然如此,从宏观上,可以说说面试。&br&&br&&b&&u&面试的两个方向:简历和方向;面试的核心词:可控。&/u&&/b&&br&&br&不论面试如何进行,面试官所能问的问题无非基于两点展开:&b&1. 你的简历所呈现的经历&/b&--表明你的经验、过往表现的;&b&2. 你的岗位/方向&/b&--表明你的技术能力和匹配度。&br&所以在这里,我在简历上强调的&b&可控&/b&非常关键。而你真正的水平,决定了另一方面。&br&&br&另外,面试过程呢?&br&
面试的一个比较有用的诀窍还是&b&可控&/b&。你最好能&b&主导&/b&面试过程。&br&
面试官一定会提问题。你如何去回答呢?主动。尽量不要“他一句话问你个问题,你一句话回答上来就over”。除非面试官问的是一些确实很基础的知识。否则,给出原因/分析过程,一直到你如何得到你的结论。&br&
同时,这样做也在给自己创造机会,如果你对于恰巧某个知识点掌握很好的话,在这个过程中,你有机会展现出你丰富的知识背景和扩展的能力--你可以“顺便”把相关的问题和思考一并说出来,以此展现出你的&b&知识图谱&/b&。&br&
这个过程,就是主动掌控面试节奏的过程--同样的时间内,面试官问得越多,你越有可能面临风险。所以啊,面试过程真的全凭一张嘴。&br&&br&*&b&当然这也不是说废话和不懂装懂地在扯淡--你一定要有真才实学,不然这不在我们讨论的范围内。&/b&&br&&br&至于相关的技术问题,自己的领域常问哪些请自行搜索。网上基本都有的。&br&&br&&b&面试的some tips:&/b&&br&1. 面试有一些常问的问题,比如:&br&请简单自我介绍。&br&自我评价,你的缺点有哪些?&br&你还有什么想问的?&br&这类问题,知乎上已经有了相关的很精彩的回答,这里不再做多余回答。其中第三个问题的回答非常精彩:&a href=&/question/& class=&internal&&当面试官问「你有什么要问我的吗」时,应该问什么? - 面试问题&/a&&br&&br&2. 除了技术实习,面试官会看重哪些能力?典型的几个是:好奇心、学习能力、解决问题的能力等。&br&
举个例子:我现在的岗位需要的知识,学校里并不会教授。那么我如何展现这两点的呢?我介绍了我如何找到自己喜欢的方向,并且通过自学(MOOC证书等)等手段学习的过程。而不仅仅停留在,我觉得这个有趣的程度上--我真的学习了。&br&这里也提个醒,不仅仅停留在兴趣二字上。举个例子,很多计算机专业的同学并不喜欢编程,于是会寻求产品经理等岗位。但是很重要的是,凭什么给你?仅仅是你说“我更喜欢产品”。那么你对产品了解多少?认识有多深刻?or什么是产品?某一款产品你如何评价?这些问题,没事多思考,多看看。千万不要仅仅说一句:我有兴趣。虽然会有一小部分人拿到面试官的仁慈offer,决定给你个机会(当然,这个机会也是你展现出了其他方面足够的品质才能仅靠兴趣打动面试官),大部分人来看,byebye。&br&&b&&u&而从风险控制来讲,不要总把自己假想为幸运儿&/u&。&/b&&br&
至于解决问题的能力,经常体现在:面试官(特别是终面)会问很难的问题。不要慌,一般情况下,面试官会主动引导你的,这个过程就是考验你解决实际问题的能力。&br&&br&写在最后:这篇文章不是教授你如何投机地拿到offer,而是对于有能力的人,给出一些建议和思考,帮助你加大把握,合理规避风险,最大限度展现出你自己的真才实学。&br&&br&***如需转载,请联系我***
声明,本文不止适用于此题,大部分的简历、面试都可以参考这个回答。因为没找到合适的题目放这个回答,所以放到这里。 因为从大二开始就帮助公司(阿里)做推荐,所以在简历方面还算有一些经验:我可能没法直接做出一份出色的简历,但是我知道能帮助你避免…
&img src=&/v2-1b038db0efd5ddf6d333b3f_b.png& data-rawwidth=&701& data-rawheight=&408& class=&origin_image zh-lightbox-thumb& width=&701& data-original=&/v2-1b038db0efd5ddf6d333b3f_r.png&&&p&双十一你们的手还健在吗? 还在的话来刷一波题?&br&&/p&&p&希望此文可以长期更新并作为一篇Python的面试宝典。每一道题目都附有详细解答,以及更加详细的回答链接。此篇是概念篇,下一篇会更新面试题代码篇。&/p&&p&&img data-rawheight=&408& data-rawwidth=&701& src=&/v2-1b038db0efd5ddf6d333b3f_b.png& class=&origin_image zh-lightbox-thumb& width=&701& data-original=&/v2-1b038db0efd5ddf6d333b3f_r.png&&(一)、这两个参数是什么意思:*args,**kwargs?我们为什么要使用它们?&/p&&p&答:如果我们不确定往一个函数中传入多少参数,或者我们希望以元组(tuple)或者列表(list)的形式传参数的时候,我们可以使用*args(单星号)。如果我们不知道往函数中传递多少个关键词参数或者想传入字典的值作为关键词参数的时候我们可以使用**kwargs(双星号),args、kwargs两个标识符是约定俗成的用法。&/p&&p&另一种答法:当函数的参数前面有一个星号*号的时候表示这是一个可变的位置参数,两个星号**表示这个是一个可变的关键词参数。星号*把序列或者集合解包(unpack)成位置参数,两个星号**把字典解包成关键词参数。 &br&&/p&&p&代码辅助理解:&img data-rawheight=&496& data-rawwidth=&856& src=&/v2-4053fc4dad7aa258b2bc7cd_b.png& class=&origin_image zh-lightbox-thumb& width=&856& data-original=&/v2-4053fc4dad7aa258b2bc7cd_r.png&&&/p&&p&(二)、谈一谈Python的装饰器(decorator)&br&&/p&&p&装饰器本质上是一个Python函数,它可以让其它函数在不作任何变动的情况下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景。比如:插入日志、性能测试、事务处理、缓存、权限校验等。有了装饰器我们就可以抽离出大量的与函数功能无关的雷同代码进行重用。&/p&&p&有关于具体的装饰器的用法看这里:&a class=& wrap external& href=&/?target=http%3A///link%3Furl%3DhuR7xMwVwBlE0WQpEmVCsWtnvVbfV62M87wXZ5JQoSPgtl7_9xWym6VABe2YQvu2POqYvDAFAlk6wCQZSHeGpYPmpAIvfvkDJzpxTU4kNui4Bj4nYnzucWAYswvubnfopp7OzZk9zChKIFlB-k9-N9avBrLrjaPf5pdI94wyPw8_Or-jBPU_CkgLzz6N_KoK%26wd%3D%26eqid%3D0fc2279b9& target=&_blank& rel=&nofollow noreferrer&&装饰器 - 廖雪峰的官方网站&i class=&icon-external&&&/i&&/a&&/p&&p&&img data-rawheight=&595& data-rawwidth=&717& src=&/v2-f42f014edec7aef2b3d87cf_b.png& class=&origin_image zh-lightbox-thumb& width=&717& data-original=&/v2-f42f014edec7aef2b3d87cf_r.png&& (三)、简要描述Python的垃圾回收机制(garbage collection)&/p&&p&Python中的垃圾回收是以&b&引用计数&/b&为主,&b&标记-清除&/b&和&b&分代收集&/b&为辅。 &/p&&ul&&li& 引用计数:Python在内存中存储每个对象的引用计数,如果计数变成0,该对象就会消失,分配给该对象的内存就会释放出来。&/li&&li& 标记-清除:一些容器对象,比如list、dict、tuple,instance等可能会出现引用循环,对于这些循环,垃圾回收器会定时回收这些循环(对象之间通过引用(指针)连在一起,构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边)。&/li&&li&分代收集:Python把内存根据对象存活时间划分为三代,对象创建之后,垃圾回收器会分配它们所属的代。每个对象都会被分配一个代,而被分配更年轻的代是被优先处理的,因此越晚创建的对象越容易被回收。&br&&/li&&/ul&&p&如果你想要深入了解Python的GC机制,点击这里:&a class=& wrap external& href=&/?target=http%3A///p/1e375fb40506& target=&_blank& rel=&nofollow noreferrer&&[转载]Python垃圾回收机制--完美讲解!&i class=&icon-external&&&/i&&/a&&/p&&p&(四)、Python多线程(multi-threading)。这是个好主意吗?&/p&&p&Python并不支持真正意义上的多线程,Python提供了多线程包。Python中有一个叫Global Interpreter Lock(GIL)的东西,它能确保你的代码中永远只有一个线程在执行。经过GIL的处理,会增加执行的开销。这就意味着如果你先要提高代码执行效率,使用threading不是一个明智的选择,当然如果你的代码是IO密集型,多线程可以明显提高效率,相反如果你的代码是CPU密集型的这种情况下多线程大部分是鸡肋。 &/p&&p&想要深入详细了解多线程,点击这里:&a class=& wrap external& href=&/?target=http%3A//www.jb51.net/article/63784.htm& target=&_blank& rel=&nofollow noreferrer&&详解Python中的多线程编程_python&i class=&icon-external&&&/i&&/a&&/p&&p&想了解一下IO密集和CPU密集可以点击这里:&a href=&/?target=http%3A//blog.csdn.net/q_l_s/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CPU-bound(计算密集型) 和I/O bound(I/O密集型)&i class=&icon-external&&&/i&&/a&&br&&/p&&p&(五)、 说明&b&os,sys&/b&模块不同,并列举常用的模块方法?&/p&&p&官方文档: &br&&/p&&ul&&li&os模板提供了一种方便的使用操作系统函数的方法&/li&&li&sys模板可供访问由解释器使用或维护的变量和与解释器交互的函数&/li&&/ul&&p&另一种回答:&/p&&p&os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口。sys模块负责程序与Python解释器的交互,提供了一系列的函数和变量用户操作Python运行时的环境。&/p&&p&一些常用的方法:&img data-rawheight=&489& data-rawwidth=&703& src=&/v2-34602fbbcd5c3e_b.png& class=&origin_image zh-lightbox-thumb& width=&703& data-original=&/v2-34602fbbcd5c3e_r.png&&&img data-rawheight=&490& data-rawwidth=&1078& src=&/v2-b1cf8ab17dcefeb0c659_b.png& class=&origin_image zh-lightbox-thumb& width=&1078& data-original=&/v2-b1cf8ab17dcefeb0c659_r.png&&一些常用的用法示例:&/p&&p&&img data-rawheight=&465& data-rawwidth=&867& src=&/v2-4f4bf284e545f2ba740143_b.png& class=&origin_image zh-lightbox-thumb& width=&867& data-original=&/v2-4f4bf284e545f2ba740143_r.png&& 想要了解更详细的使用请访问:&a href=&/?target=http%3A///pycode/p/sysos.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&os和sys模块 - 君醉&i class=&icon-external&&&/i&&/a&&/p&&p&(六)、什么是lambda表达式?它有什么好处?&/p&&p&简单来说,lambda表达式通常是当你需要使用一个函数,但是又不想费脑袋去命名一个函数的时候使用,也就是通常所说的匿名函数。&/p&&p&lambda表达式一般的形式是:关键词lambda后面紧接一个或多个参数,紧接一个冒号“:”,紧接一个表达式。lambda表达式是一个表达式不是一个语句。&/p&&p&&img data-rawheight=&185& data-rawwidth=&404& src=&/v2-9aa02ef535d_b.png& class=&content_image& width=&404&& 想更加详细的了解Python中的Lamdba表达式可以点击这里:&a class=&internal& href=&/question/&&Lambda 表达式有何用处?如何使用? - Python&/a&&/p&&p&(七)、Python中pass语句的作用是什么?&/p&&p&pass语句不会执行任何操作,一般作为占位符或者创建占位程序 &/p&&p&(八)、Python是如何进行类型转换的?&/p&&p&Python提供了将变量或值从一种类型转换为另一种类型的内置方法。&img data-rawheight=&566& data-rawwidth=&824& src=&/v2-dd0f7f44bae_b.png& class=&origin_image zh-lightbox-thumb& width=&824& data-original=&/v2-dd0f7f44bae_r.png&& (九)、Python里面如何拷贝一个对象?&/p&&p&Python中对象之间的赋值是按引用传递的,如果要拷贝对象需要使用标准模板中的copy&/p&&ul&&li&copy.copy:浅拷贝,只拷贝父对象,不拷贝父对象的子对象。&/li&&li&copy.deepcopy:深拷贝,拷贝父对象和子对象。&/li&&/ul&&p&&img data-rawheight=&344& data-rawwidth=&864& src=&/v2-bb6b8dd0b523deedfded1f_b.png& class=&origin_image zh-lightbox-thumb& width=&864& data-original=&/v2-bb6b8dd0b523deedfded1f_r.png&&(十)、__new__和__init__的区别。&/p&&ul&&li&__init__为初始化方法,__new__方法是真正的构造函数。&/li&&li&__new__是实例创建之前被调用,它的任务是创建并返回该实例,是静态方法&/li&&li&__init__是实例创建之后被调用的,然后设置对象属性的一些初始值。 &br&&/li&&/ul&&p&总结:__new__方法在__init__方法之前被调用,并且__new__方法的返回值将传递给__init__方法作为第一个参数,最后__init__给这个实例设置一些参数。&/p&&p&&img data-rawheight=&367& data-rawwidth=&643& src=&/v2-1e2c48de9524cbe2d41e6b985a87d448_b.png& class=&origin_image zh-lightbox-thumb& width=&643& data-original=&/v2-1e2c48de9524cbe2d41e6b985a87d448_r.png&&想要更加详细的了解这两个方法,请点击:&a class=& wrap external& href=&/?target=http%3A//my.oschina.net/kinegratii/blog/334968& target=&_blank& rel=&nofollow noreferrer&&Python中的__new__及其用法 &i class=&icon-external&&&/i&&/a&&/p&&p&(十一)、Python中单下划线和双下划线分别是什么?&/p&&ul&&li&__name__:一种约定,Python内部的名字,用来与用户自定义的名字区分开,防止冲突&/li&&li&_name:一种约定,用来指定变量私有&/li&&li&__name:解释器用_classname__name来代替这个名字用以区别和其他类相同的命名&/li&&/ul&&p& 想要更加详细的了解这两者的区别,请点击:&a class=& wrap external& href=&/?target=https%3A///a/1411& target=&_blank& rel=&nofollow noreferrer&&Python中的下划线(译文)&i class=&icon-external&&&/i&&/a&&/p&&p&(十二)、说一说Python自省。&/p&&p&自省就是面向对象的语言所写的程序在运行时,所能知道对象的类型。简单一句话就是运行时能够获得对象的类型。比如:&b&type()、dir()、getattr()、hasattr()、isinstance()
&img data-rawheight=&345& data-rawwidth=&1351& src=&/v2-da6bbea596c241c728f1a7d_b.png& class=&origin_image zh-lightbox-thumb& width=&1351& data-original=&/v2-da6bbea596c241c728f1a7d_r.png&&&/b&&/p&&p&想要完整的理解Python自省,请点击:&a href=&/?target=http%3A///page/87128/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python自省(反射)指南&i class=&icon-external&&&/i&&/a&&/p&&p&&b&有关于元类以及单例模式会在后面文章中做详细的解释说明。 &/b&&br&&/p&&p&本文参考文献资料:&/p&&p&「1」&a class=& wrap external& href=&/?target=http%3A//blog.csdn.net/alvine008/article/details/& target=&_blank& rel=&nofollow noreferrer&&七、PYTHON 一些基础面试题目总结&i class=&icon-external&&&/i&&/a&&/p&&p&「2」&a class=& wrap external& href=&/?target=http%3A///85231/& target=&_blank& rel=&nofollow noreferrer&&很全的 Python 面试题&i class=&icon-external&&&/i&&/a&&/p&&p&「3」&a href=&/?target=http%3A///page/87128/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python自省(反射)指南&i class=&icon-external&&&/i&&/a&&/p&&p&「4」&a href=&/?target=http%3A//blog.csdn.net/mathboylinlin/article/details/9413551& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python学习笔记(十二):lambda表达式与函数式编程&i class=&icon-external&&&/i&&/a&&/p&&p&「5」&a class=& wrap external& href=&/?target=http%3A///Vito2008/p/5044251.html& target=&_blank& rel=&nofollow noreferrer&&Python面试必须要看的15个问题&i class=&icon-external&&&/i&&/a&&/p&&br&&b&学习编程,欢迎关注专栏:&a href=&/passer& class=&internal&&学习编程 - 知乎专栏&/a&&/b&
双十一你们的手还健在吗? 还在的话来刷一波题? 希望此文可以长期更新并作为一篇Python的面试宝典。每一道题目都附有详细解答,以及更加详细的回答链接。此篇是概念篇,下一篇会更新面试题代码篇。(一)、这两个参数是什么意思:*args,**kwargs?我们为…
&img src=&/v2-51e7585cbdbc944f7b9f_b.jpg& data-rawwidth=&1920& data-rawheight=&771& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/v2-51e7585cbdbc944f7b9f_r.jpg&&&blockquote&&p&&em&&strong&文章来源:&/strong&&/em&&a href=&/?target=http%3A///xrq730/p/4865416.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java代码优化(长期更新)&i class=&icon-external&&&/i&&/a&&/p&&/blockquote&&br&&p&&strong&代码&/strong&&strong&优化&/strong&,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。&/p&&p&代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的。&/p&&br&&p&&strong&代码优化的目标是&/strong&&/p&&ul&&li&&p&减小代码的体积&/p&&/li&&li&&p&提高代码运行的效率&/p&&/li&&/ul&&br&&p&&strong&代码优化细节&/strong&&/p&&ul&&li&&p&&strong&1、尽量指定类、方法的final修饰符&/strong&&/p&&/li&&/ul&&p&带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的。为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,具体参见Java运行期优化。&strong&此举能够使性能平均提高50%&/strong&。&/p&&br&&ul&&li&&p&&strong&2、尽量重用对象&/strong&&/p&&/li&&/ul&&p&特别是String对象的使用,出现字符串连接时应该使用StringBuilder/StringBuffer代替。由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理,因此,生成过多的对象将会给程序的性能带来很大的影响。&/p&&br&&ul&&li&&p&&strong&3、尽可能使用局部变量&/strong&&/p&&/li&&/ul&&p&调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中速度较快,其他变量,如静态变量、实例变量等,都在堆中创建,速度较慢。另外,栈中创建的变量,随着方法的运行结束,这些内容就没了,不需要额外的垃圾回收。&/p&&br&&ul&&li&&p&&strong&4、及时关闭流&/strong&&/p&&/li&&/ul&&p&Java编程过程中,进行数据库连接、I/O流操作时务必小心,在使用完毕后,及时关闭以释放资源。因为对这些大对象的操作会造成系统大的开销,稍有不慎,将会导致严重的后果。&/p&&br&&ul&&li&&p&&strong&5、尽量减少对变量的重复计算&/strong&&/p&&/li&&/ul&&p&明确一个概念,对方法的调用,即使方法中只有一句语句,也是有消耗的,包括创建栈帧、调用方法时保护现场、调用方法完毕时恢复现场等。所以例如下面的操作:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&k&&for&/span& &span class=&o&&(&/span&&span class=&kt&&int&/span& &span class=&n&&i&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&o&&;&/span& &span class=&n&&i&/span& &span class=&o&&&&/span& &span class=&n&&list&/span&&span class=&o&&.&/span&&span class=&na&&size&/span&&span class=&o&&();&/span& &span class=&n&&i&/span&&span class=&o&&++)&/span&
&span class=&o&&{...}&/span&
&/code&&/pre&&/div&&p&建议替换为:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&k&&for&/span& &span class=&o&&(&/span&&span class=&kt&&int&/span& &span class=&n&&i&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&o&&,&/span& &span class=&kt&&int&/span& &span class=&n&&length&/span& &span class=&o&&=&/span& &span class=&n&&list&/span&&span class=&o&&.&/span&&span class=&na&&size&/span&&span class=&o&&();&/span& &span class=&n&&i&/span& &span class=&o&&&&/span& &span class=&n&&length&/span&&span class=&o&&;&/span& &span class=&n&&i&/span&&span class=&o&&++)&/span&
&span class=&o&&{...}&/span&
&/code&&/pre&&/div&&p&这样,在list.size()很大的时候,就减少了很多的消耗&/p&&br&&ul&&li&&p&&strong&6、尽量采用懒加载的策略,即在需要的时候才创建&/strong&&/p&&/li&&/ul&&p&例如:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&n&&String&/span& &span class=&n&&str&/span& &span class=&o&&=&/span& &span class=&s&&&aaa&&/span&&span class=&o&&;&/span&&span class=&k&&if&/span& &span class=&o&&(&/span&&span class=&n&&i&/span& &span class=&o&&==&/span& &span class=&mi&&1&/span&&span class=&o&&)&/span&
&span class=&o&&{&/span&
&span class=&n&&list&/span&&span class=&o&&.&/span&&span class=&na&&add&/span&&span class=&o&&(&/span&&span class=&n&&str&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&建议替换为:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&k&&if&/span& &span class=&o&&(&/span&&span class=&n&&i&/span& &span class=&o&&==&/span& &span class=&mi&&1&/span&&span class=&o&&)&/span&
&span class=&o&&{&/span&
&span class=&n&&String&/span& &span class=&n&&str&/span& &span class=&o&&=&/span& &span class=&s&&&aaa&&/span&&span class=&o&&;&/span&
&span class=&n&&list&/span&&span class=&o&&.&/span&&span class=&na&&add&/span&&span class=&o&&(&/span&&span class=&n&&str&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&ul&&li&&strong&7、慎用异常&/strong&&br&&/li&&/ul&&br&&p&异常对性能不利。抛出异常首先要创建一个新的对象,Throwable接口的构造函数调用名为fillInStackTrace()的本地同步方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,Java虚拟机就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。异常只能用于错误处理,不应该用来控制程序流程。&br&&/p&&br&&ul&&li&&p&&strong&8、不要在循环中使用try…catch…,应该把其放在最外层&/strong&&br&&/p&&/li&&/ul&&p&除非不得已。如果毫无理由地这么写了,只要你的领导资深一点、有强迫症一点,八成就要骂你为什么写出这种垃圾代码来了。&br&&/p&&br&&ul&&li&&p&&strong&9、如果能估计到待添加的内容长度,为底层以数组方式实现的集合、工具类指定初始长度&/strong&&br&&/p&&/li&&/ul&&p&比如ArrayList、LinkedLlist、StringBuilder、StringBuffer、HashMap、HashSet等等,以StringBuilder为例:&br&&/p&&p&(1)StringBuilder()      // 默认分配16个字符的空间&/p&&p&(2)StringBuilder(int size)  
// 默认分配size个字符的空间&/p&&p&(3)StringBuilder(String str) 
// 默认分配16个字符+str.length()个字符空间&/p&&p&可以通过类(这里指的不仅仅是上面的StringBuilder)的来设定它的初始化容量,这样可以明显地提升性能。比如StringBuilder吧,length表示当前的StringBuilder能保持的字符数量。因为当StringBuilder达到最大容量的时候,它会将自身容量增加到当前的2倍再加2,无论何时只要StringBuilder达到它的最大容量,它就不得不创建一个新的字符数组然后将旧的字符数组内容拷贝到新字符数组中—-这是十分耗费性能的一个操作。试想,如果能预估到字符数组中大概要存放5000个字符而不指定长度,最接近5000的2次幂是4096,每次扩容加的2不管,那么:&/p&&p&(1)在4096 的基础上,再申请8194个大小的字符数组,加起来相当于一次申请了12290个大小的字符数组,如果一开始能指定5000个大小的字符数组,就节省了一倍以上的空间;&/p&&p&(2)把原来的4096个字符拷贝到新的的字符数组中去。&br&&/p&&p&这样,既浪费内存空间又降低代码运行效率。所以,给底层以数组实现的集合、工具类设置一个合理的初始化容量是错不了的,这会带来立竿见影的效果。但是,注意,像HashMap这种是以数组+链表实现的集合,别把初始大小和你估计的大小设置得一样,因为一个table上只连接一个对象的可能性几乎为0。初始大小建议设置为2的N次幂,如果能估计到有2000个元素,设置成new HashMap(128)、new HashMap(256)都可以。&br&&/p&&br&&ul&&li&&p&&strong&10、当复制大量数据时,使用System.arraycopy()命令&/strong&&/p&&/li&&/ul&&br&&ul&&li&&p&&strong&11、乘法和除法使用移位操作&/strong&&/p&&/li&&/ul&&p&例如:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&k&&for&/span& &span class=&o&&(&/span&&span class=&n&&val&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&o&&;&/span& &span class=&n&&val&/span& &span class=&o&&&&/span& &span class=&mi&&100000&/span&&span class=&o&&;&/span& &span class=&n&&val&/span& &span class=&o&&+=&/span& &span class=&mi&&5&/span&&span class=&o&&)&/span&
&span class=&o&&{&/span&
&span class=&n&&a&/span& &span class=&o&&=&/span& &span class=&n&&val&/span& &span class=&o&&*&/span& &span class=&mi&&8&/span&&span class=&o&&;&/span&
&span class=&n&&b&/span& &span class=&o&&=&/span& &span class=&n&&val&/span& &span class=&o&&/&/span& &span class=&mi&&2&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&用移位操作可以极大地提高性能,因为在计算机底层,对位的操作是最方便、最快的,因此建议修改为:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&k&&for&/span& &span class=&o&&(&/span&&span class=&n&&val&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&o&&;&/span& &span class=&n&&val&/span& &span class=&o&&&&/span& &span class=&mi&&100000&/span&&span class=&o&&;&/span& &span class=&n&&val&/span& &span class=&o&&+=&/span& &span class=&mi&&5&/span&&span class=&o&&)&/span&
&span class=&o&&{&/span&
&span class=&n&&a&/span& &span class=&o&&=&/span& &span class=&n&&val&/span& &span class=&o&&&&&/span& &span class=&mi&&3&/span&&span class=&o&&;&/span&
&span class=&n&&b&/span& &span class=&o&&=&/span& &span class=&n&&val&/span& &span class=&o&&&&&/span& &span class=&mi&&1&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&移位操作虽然快,但是可能会使代码不太好理解,因此最好加上相应的注释。&/p&&br&&ul&&li&&p&&strong&12、循环内不要不断创建对象引用&/strong&&/p&&/li&&/ul&&p&例如:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&k&&for&/span& &span class=&o&&(&/span&&span class=&kt&&int&/span& &span class=&n&&i&/span& &span class=&o&&=&/span& &span class=&mi&&1&/span&&span class=&o&&;&/span& &span class=&n&&i&/span& &span class=&o&&&=&/span& &span class=&n&&count&/span&&span class=&o&&;&/span& &span class=&n&&i&/span&&span class=&o&&++)&/span&
&span class=&o&&{&/span&
&span class=&n&&Object&/span& &span class=&n&&obj&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&Object&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&这种做法会导致内存中有count份Object对象引用存在,count很大的话,就耗费内存了,建议为改为:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&n&&Object&/span& &span class=&n&&obj&/span& &span class=&o&&=&/span& &span class=&kc&&null&/span&&span class=&o&&;&/span&&span class=&k&&for&/span& &span class=&o&&(&/span&&span class=&kt&&int&/span& &span class=&n&&i&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&o&&;&/span& &span class=&n&&i&/span& &span class=&o&&&=&/span& &span class=&n&&count&/span&&span class=&o&&;&/span& &span class=&n&&i&/span&&span class=&o&&++)&/span&
&span class=&o&&{&/span&
&span class=&n&&obj&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&Object&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&这样的话,内存中只有一份Object对象引用,每次new Object()的时候,Object对象引用指向不同的Object罢了,但是内存中只有一份,这样就大大节省了内存空间了。&/p&&br&&ul&&li&&p&&strong&13、基于效率和类型检查的考虑,应该尽可能使用array,无法确定数组大小时才使用ArrayList&/strong&&/p&&/li&&li&&p&&strong&14、尽量使用HashMap、ArrayList、StringBuilder,除非线程安全需要,否则不推荐使用Hashtable、Vector、StringBuffer,后三者由于使用同步机制而导致了性能开销&/strong&&/p&&/li&&li&&p&&strong&15、不要将数组声明为public static final&/strong&&/p&&/li&&/ul&&p&因为这毫无意义,这样只是定义了引用为static final,数组的内容还是可以随意改变的,将数组声明为public更是一个安全漏洞,这意味着这个数组可以被外部类所改变。&/p&&br&&ul&&li&&p&&strong&16、尽量在合适的场合使用单例&/strong&&/p&&/li&&/ul&&p&使用单例可以减轻加载的负担、缩短加载的时间、提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面:&/p&&p&(1)控制资源的使用,通过线程同步来控制资源的并发访问&/p&&p&(2)控制实例的产生,以达到节约资源的目的&/p&&p&(3)控制数据的共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信&/p&&br&&ul&&li&&p&&strong&17、尽量避免随意使用静态变量&/strong&&/p&&/li&&/ul&&p&要知道,当某个对象被定义为static的变量所引用,那么gc通常是不会回收这个对象所占有的堆内存的,如:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&kd&&public&/span& &span class=&kd&&class&/span& &span class=&nc&&A&/span&
&span class=&o&&{&/span&
&span class=&kd&&private&/span& &span class=&kd&&static&/span& &span class=&n&&B&/span& &span class=&n&&b&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&B&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&此时静态变量b的生命周期与A类相同,如果A类不被卸载,那么引用B指向的B对象会常驻内存,直到程序终止&/p&&br&&ul&&li&&p&&strong&18、及时清除不再需要的会话&/strong&&/p&&/li&&/ul&&p&为了清除不再活动的会话,许多应用服务器都有默认的会话超时时间,一般为30分钟。当应用服务器需要保存更多的会话时,如果内存不足,那么操作系统会把部分数据转移到磁盘,应用服务器也可能根据MRU(最近最频繁使用)算法把部分不活跃的会话转储到磁盘,甚至可能抛出内存不足的异常。如果会话要被转储到磁盘,那么必须要先被序列化,在大规模集群中,对对象进行序列化的代价是很昂贵的。因此,当会话不再需要时,应当及时调用HttpSession的invalidate()方法清除会话。&/p&&br&&ul&&li&&p&&strong&19、实现RandomAccess接口的集合比如ArrayList,应当使用最普通的for循环而不是foreach循环来遍历&/strong&&/p&&/li&&/ul&&p&这是JDK推荐给用户的。JDK API对于RandomAccess接口的解释是:实现RandomAccess接口用来表明其支持快速随机访问,此接口的主要目的是允许一般的算法更改其行为,从而将其应用到随机或连续访问列表时能提供良好的性能。实际经验表明,实现RandomAccess接口的类实例,假如是随机访问的,使用普通for循环效率将高于使用foreach循环;反过来,如果是顺序访问的,则使用Iterator会效率更高。可以使用类似如下的代码作判断:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&k&&if&/span& &span class=&o&&(&/span&&span class=&n&&list&/span& &span class=&k&&instanceof&/span& &span class=&n&&RandomAccess&/span&&span class=&o&&)&/span&
&span class=&o&&{&/span& &span class=&k&&for&/span& &span class=&o&&(&/span&&span class=&kt&&int&/span& &span class=&n&&i&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&o&&;&/span& &span class=&n&&i&/span& &span class=&o&&&&/span& &span class=&n&&list&/span&&span class=&o&&.&/span&&span class=&na&&size&/span&&span class=&o&&();&/span& &span class=&n&&i&/span&&span class=&o&&++){}&/span&
&span class=&o&&}&/span&&span class=&k&&else&/span&&span class=&o&&{&/span&
&span class=&n&&Iterator&/span&&span class=&o&&&?&&/span& &span class=&n&&iterator&/span& &span class=&o&&=&/span& &span class=&n&&list&/span&&span class=&o&&.&/span&&span class=&na&&iterable&/span&&span class=&o&&();&/span& &span class=&k&&while&/span& &span class=&o&&(&/span&&span class=&n&&iterator&/span&&span class=&o&&.&/span&&span class=&na&&hasNext&/span&&span class=&o&&()){&/span&&span class=&n&&iterator&/span&&span class=&o&&.&/span&&span class=&na&&next&/span&&span class=&o&&()}&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&foreach循环的底层实现原理就是迭代器Iterator,参见Java语法糖1:可变长度参数以及foreach循环原理。所以后半句”反过来,如果是顺序访问的,则使用Iterator会效率更高”的意思就是顺序访问的那些类实例,使用foreach循环去遍历。&/p&&br&&ul&&li&&p&&strong&20、使用同步代码块替代同步方法&/strong&&br&&/p&&/li&&/ul&&p&这点在多线程模块中的synchronized锁方法块一文中已经讲得很清楚了,除非能确定一整个方法都是需要进行同步的,否则尽量使用同步代码块,避免对那些不需要进行同步的代码也进行了同步,影响了代码执行效率。&/p&&br&&ul&&li&&p&&strong&21、将常量声明为static final,并以大写命名&/strong&&/p&&/li&&/ul&&p&这样在编译期间就可以把这些内容放入常量池中,避免运行期间计算生成常量的值。另外,将常量的名字以大写命名也可以方便区分出常量与变量&br&&/p&&br&&ul&&li&&p&&strong&22、不要创建一些不使用的对象,不要导入一些不使用的类&/strong&&/p&&/li&&/ul&&p&这毫无意义,如果代码中出现”The value of the local variable i is not used”、”The import java.util is never used”,那么请删除这些无用的内容&/p&&br&&ul&&li&&p&&strong&23、程序运行过程中避免使用反射&/strong&&br&&/p&&/li&&/ul&&p&关于,请参见反射。反射是Java提供给用户一个很强大的功能,功能强大往往意味着效率不高。不建议在程序运行过程中使用尤其是频繁使用反射机制,特别是Method的invoke方法,如果确实有必要,一种建议性的做法是将那些需要通过反射加载的类在项目启动的时候通过反射实例化出一个对象并放入内存—-用户只关心和对端交互的时候获取最快的响应速度,并不关心对端的项目启动花多久时间。&/p&&br&&ul&&li&&p&&strong&24、使用数据库连接池和线程池&/strong&&/p&&/li&&/ul&&p&这两个池都是用于重用对象的,前者可以避免频繁地打开和关闭连接,后者可以避免频繁地创建和销毁线程&/p&&br&&ul&&li&&p&&strong&25、使用带缓冲的输入输出流进行IO操作&/strong&&/p&&/li&&/ul&&p&带缓冲的输入输出流,即BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream,这可以极大地提升IO效率&/p&&br&&ul&&li&&p&&strong&26、顺序插入和随机访问比较多的场景使用ArrayList,元素删除和中间插入比较多的场景使用LinkedList&/strong&&/p&&/li&&/ul&&p&这个,理解ArrayList和LinkedList的原理就知道了&/p&&br&&ul&&li&&p&&strong&27、不要让public方法中有太多的形参&/strong&&/p&&/li&&/ul&&p&public方法即对外提供的方法,如果给这些方法太多形参的话主要有两点坏处:&br&&/p&&p&1、违反了面向对象的编程思想,Java讲求一切都是对象,太多的形参,和面向对象的编程思想并不契合&br&&/p&&p&2、参数太多势必导致方法调用的出错概率增加&br&&/p&&p&至于这个”太多”指的是多少个,3、4个吧。比如我们用JDBC写一个insertStudentInfo方法,有10个学生信息字段要插如Student表中,可以把这10个参数封装在一个实体类中,作为insert方法的形参。&/p&&br&&ul&&li&&p&&strong&28、字符串变量和字符串常量equals的时候将字符串常量写在前面&/strong&&/p&&/li&&/ul&&p&这是一个比较常见的小技巧了,如果有以下代码:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&n&&String&/span& &span class=&n&&str&/span& &span class=&o&&=&/span& &span class=&s&&&123&&/span&&span class=&o&&;&/span&
&span class=&k&&if&/span& &span class=&o&&(&/span&&span class=&n&&str&/span&&span class=&o&&.&/span&&span class=&na&&equals&/span&&span class=&o&&(&/span&&span class=&s&&&123&&/span&&span class=&o&&))&/span& &span class=&o&&{...}&/span&
&/code&&/pre&&/div&&p&建议修改为:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&n&&String&/span& &span class=&n&&str&/span& &span class=&o&&=&/span& &span class=&s&&&123&&/span&&span class=&o&&;&/span&
&span class=&k&&if&/span& &span class=&o&&(&/span&&span class=&s&&&123&&/span&&span class=&o&&.&/span&&span class=&na&&equals&/span&&span class=&o&&(&/span&&span class=&n&&str&/span&&span class=&o&&))&/span&
&span class=&o&&{&/span&
&span class=&o&&...&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&这么做主要是可以避免空指针异常&/p&&br&&ul&&li&&p&&strong&29、请知道,在java中if (i == 1)和if (1 == i)是没有区别的,但从阅读习惯上讲,建议使用前者&/strong&&/p&&/li&&/ul&&p&平时有人问,”if (i == 1)”和”if (1== i)”有没有区别,这就要从C/C++讲起。&br&&/p&&p&在C/C++中,”if (i == 1)”判断条件成立,是以0与非0为基准的,0表示false,非0表示true,如果有这么一段代码:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&kt&&int&/span& &span class=&n&&i&/span& &span class=&o&&=&/span& &span class=&mi&&2&/span&&span class=&o&&;&/span&
&span class=&k&&if&/span& &span class=&o&&(&/span&&span class=&n&&i&/span& &span class=&o&&==&/span& &span class=&mi&&1&/span&&span class=&o&&)&/span&
&span class=&o&&{&/span&
&span class=&o&&...&/span&
&span class=&o&&}&/span&&span class=&k&&else&/span&&span class=&o&&{&/span&
&span class=&o&&...&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&C/C++判断”i==1″不成立,所以以0表示,即false。但是如果:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&kt&&int&/span& &span class=&n&&i&/span& &span class=&o&&=&/span& &span class=&mi&&2&/span&&span class=&o&&;&/span&&span class=&k&&if&/span& &span class=&o&&(&/span&&span class=&n&&i&/span& &span class=&o&&=&/span& &span class=&mi&&1&/span&&span class=&o&&)&/span& &span class=&o&&{&/span& &span class=&o&&...&/span& &span class=&o&&}&/span&&span class=&k&&else&/span&&span class=&o&&{&/span& &span class=&o&&...&/span& &span class=&o&&}&/span&
&/code&&/pre&&/div&&p&万一程序员一个不小心,把”if (i == 1)”写成”if (i = 1)”,这样就有问题了。在if之内将i赋值为1,if判断里面的内容非0,返回的就是true了,但是明明i为2,比较的值是1,应该返回的false。这种情况在C/C++的开发中是很可能发生的并且会导致一些难以理解的错误产生,所以,为了避免开发者在if语句中不正确的赋值操作,建议将if语句写为:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&int i = 2;if (1 == i) { ... }else{ ... }
&/code&&/pre&&/div&&p&这样,即使开发者不小心写成了”1 = i”,C/C++编译器也可以第一时间检查出来,因为我们可以对一个变量赋值i为1,但是不能对一个常量赋值1为i。&/p&&p&但是,在Java中,C/C++这种”if (i = 1)”的语法是不可能出现的,因为一旦写了这种语法,Java就会编译报错”Type mismatch: cannot convert from int to boolean”。但是,尽管Java的”if (i == 1)”和”if (1 == i)”在语义上没有任何区别,但是从阅读习惯上讲,建议使用前者会更好些。&/p&&ul&&li&&p&&strong&30、不要对数组使用toString()方法&/strong&&/p&&/li&&/ul&&p&看一下对数组使用toString()打印出来的是什么:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&public static void main(String[] args)
{ int[] is = new int[]{1, 2, 3};
System.out.println(is.toString());
&/code&&/pre&&/div&&p&结果是:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&[I@18a992f
&/code&&/pre&&/div&&p&本意是想打印出数组内容,却有可能因为数组引用is为空而导致空指针异常。不过虽然对数组toString()没有意义,但是对集合toString()是可以打印出集合里面的内容的,

我要回帖

更多关于 i3与i5的性能差多少 的文章

 

随机推荐