Shell's Home

python源码解析读书笔记(四)——杂项

Mar 31, 2011 - 1 minute read - Comments

1.GIL的影响 很多人讨论python性能的时候都提到一个概念,GIL。我在python源码中搜了一下,这个函数调用并不多,但是位置很要命。每个线程,生成的时候请求一下,退出的时候释放一下。在每次运行字节码前也会短暂的释放一下,让其他线程有获得运行的机会。说白了,除非程序显式的调用release_lock去释放资源,否则python是没有任何多线程能力的。这种机会并不很多,通常只发生在阻塞的时候。 而python原子化的粒度也比较清晰,就是每个字节码内部一定是原子的,字节码和字节码之间是非原子的。当我们操作l.append的时候,不用担心线程竞争导致数据结构损坏。但是如果我们操作del l[len(l)]的时候,存在发生异常的概率。 2.对象缓存池 python对小内存对象(碎片对象)提供了小内存对象缓存池。默认情况下,256字节以下的内存由小内存缓存池管理,以上的直接向系统申请,申请大小每8字节对齐。 对象缓存池的分配和收集技术采用了自由资源链表,在2.5之后,当某个尺度的资源不再需要时,会整体释放。 3.python的GC机制 python的GC机制是基于引用计数的,因此当引用计数归零,对象一定会被释放(如果是碎片对象,内存不一定直接释放,可能归对象缓存池)。 python的辅助垃圾收集算法是三色标记法和分代垃圾收集模型(generation),由于要跟踪所有的容器对象,因此容器对象上有跟踪链表。 4.字符编码处理方案 无论从何种来源,只要是字符串,并可能交给一个和当前代码并不紧密耦合的代码处理,就应当被转换为unicode。或者换一个更简洁的说法,应当使用unicode作为接口数据类型。 str对象是很难猜测编码的,当离开了数据源代码后,再分析编码是个不靠谱的方案。

python源码解析读书笔记(三)——对象和函数

Mar 30, 2011 - 1 minute read - Comments

1.mro 算法,自身先入栈,而后按声明顺序继承每个父类的mro,内部对象在最后。简单来说,深度优先,从左向右。 当类对象创建时,会将父类所有函数全部复制过来(很明显,应当是符号复制)。 2.super规则 >>> class A(object): … def f(self): print ‘A’ … >>> class B(object): … def f(self): print ‘B’ … >>> class C(A): … def f(self): print ‘C’ … >>> class D(C, B): … def f(self): super(D, self).f() … >>> d = D() >>> d.f() C >>> D.__base__ <class ‘__main__.C’> >>> D.__bases__ (<class ‘__main__.C’>, <class ‘__main__.B’>) >>> class A(object): … def f(self): print ‘A’ … >>> class B(object):

python源码解析读书笔记(二)——函数特性

Mar 29, 2011 - 2 minute read - Comments

1.函数的性质 >>> def outer(o1, o2): ... def inner(i1 = 10, i2 = \[\]): ... return i1+o1+o2 ... return inner ... >>> a1 = outer(50, 30) >>> a2 = outer(50, 30) >>> a1.func\_closure (<cell at 0xb75454f4: int object at 0x8455ddc>, <cell at 0xb7545524: int object at 0x8455cec>) >>> a2.func\_closure (<cell at 0xb754541c: int object at 0x8455ddc>, <cell at 0xb75453a4: int object at 0x8455cec>) 两次生成的函数对象拥有不同的闭包空间。 >>> a1.func\_defaults (10, \[\]) >>> a2.func\_defaults (10, \[\]) >>> a1.func\_defaults\[1\].append(10) >>> a1.func\_defaults (10, \[10\]) >>> a2.func\_defaults (10, \[\]) 也拥有不同的默认值空间。 >>> def default\_test(d = \[\]): ...

python源码解析读书笔记(一)——内置对象

Mar 27, 2011 - 1 minute read - Comments

1.类型的类型 obj int(10).ob_type -> PyInt_Type PyInt\_Type.ob\_type -> PyType\_Type PyInt\_Type.tp\_base -> PyBaseObject\_Type PyBaseObject\_Type.ob\_type -> PyType\_Type PyType\_Type.ob\_type -> PyType\_Type 更精确的参考源码解析262页图。 \ 2.小整数对象 if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { v = small\_ints\[ival + NSMALLNEGINTS\]; Py\_INCREF(v); } \ 3.大整数对象,空对象池,对象缓存 >>> a = 1000000 >>> b = 2000000 >>> id(a) == id(1000000) False >>> id(100000) == id(100000) True 最后一个是因为python解析器在解析对象的时候,对前后生成的对象进行了缓存。经过测试,对文件也有效。 \ 4.字符串对象复用和缓存 >>> c = 'qazwsxedcrfvt' >>> c += 'gbyhnujmikolp' >>> a =

豆瓣九点的认领功能

Mar 25, 2011 - 1 minute read - Comments

以前写了blog,每天都跑去豆瓣同步一下。方法是新建一篇日记,然后贴链接。今天牛博恩提醒我,“你在九点上订阅自己的博客,然后再认领就没必要更新博客的同时还在豆瓣日记上发一篇一样标题带链接的好吧,刚刚发现这么舒服的方案。我已经发贴,豆瓣来吧。 doubanclaim7834a5d025d455b1

不要问我你和妈掉进水里救哪个

Mar 25, 2011 - 1 minute read - Comments

我和你妈掉进水里你先救哪个?这个问题恐怕全地球男人都知道正确答案——不要回答。 先救老妈?只怕女朋友当场翻脸。但是先救女朋友?先不说老妈高兴不高兴,女朋友要知道你会如此对待父母,只怕也会质疑你会如何对待她的父母。所以这个问题就根本不能回答,或者说根本不要问。因为哪个回答都不是你想要的。 中国古代伦理中,这个问题倒是不难回答。百善孝为先,除了皇帝的女儿,有哪个跋扈媳妇敢问这种大逆不道的问题?只怕先是一个多言的罪名被休妻回家,回家还会被众人指指点点戳脊梁骨。外国人如何回答我不清楚,我只问了thomas这个问题。当然,准确的说,是他老婆问的。但是他的回答很有意思,救年轻的。他老婆听了很高兴,然后thomas很二的加了个注解。如果你和孩子掉进水里,我就先救孩子…… 我不知道这是不是外国人的普遍观点,不过这也代表一种观点——最大幸福理论。最大幸福理论关注的是结果,当一个冲突发生的时候,最大幸福理论的意见者总是选择获利人数最多的方案。例如一个正常的铁轨上有五个孩子在玩,一个废弃的铁轨上有一个孩子。你可以扳动扳手来决定死哪边,扳不扳?最大幸福理论者认为,扳!当然,会有另一个相反的理论跳出来。这种理论关注原因,当一个冲突发生时,他们总选择惩罚行为不正确的人。还是以铁道上的孩子为例,他们的观点是,那个孩子是正确的,所以,不扳! 应用在老妈和老婆掉到水里的问题上,最大幸福理论就很容易得到观点,保护剩余生命最长的人。当然,另一个理论就没法得出直观的结论,因为我们根本不知道老妈和老婆是怎么掉下去的。如果是老妈推老婆下去导致自己也下去了呢?关注行为的理论就能得到结论,救老婆。 相较于外国的两大观点,分别关注过程和结果。中国的理论更关注“关系”,关系决定论占据了东方决策的主流。以双方的关系,子女和父母的关系,夫妻的关系,来决定每个人的行为。这就是所谓的“父父子子君君臣臣”。从传统观点来看,媳妇敢和婆婆争重要性,无疑是忤逆犯上了。其最简洁的回答就是,媳妇可以再找,老娘只有一个。这个理论推广开,就是婆婆折磨媳妇,多年媳妇熬成婆的传统。这个传统的对错暂且不论,中国传统伦理那一套已经被我们彻底打倒了,还踩上一只脚让其永世不得翻身。文革平反后,中国又开始了大规模的城市化进程。这个传统的儒家伦理体系现在是不受到什么重视了,只是在每个传统中国人的行事里面看到痕迹而已。 那么现下中国人的实际答案呢?救老婆。有意思的是,这个观点的形成并不是理论体系的指导和理论体系对现实的适应,而是彻彻底底的市场运作。由于一胎制的推行和中国传统重男思想的痕迹,所以中国男女比例严重畸形,男性人数远远大于女性。上面那句回答的实际情况就变成了,老娘只有一个,媳妇一个不到。所以聪明点的中国人都知道,养女儿,不要养儿子,儿子是个赔钱货。在这种情况下,男士们虽然碍于传统中国思想,都不敢大声说出自己的选择。但是在有意无意中,都照着这个实际答案做了。 所以由此产生的中国女性解放,不得不说带着畸形的痕迹。新中国的女性要求照着欧美靠拢,但是唯独不学人家的女性独立生活的能力。当然,中间要插一句的是,中国人也向来不注重培养年轻人的独立生活能力。一个美国学生发表这方面言论还被死亡威胁。(具体看这里:http://internet.solidot.org/article.pl?sid=11/03/21/037231&from=rss)中国女性希望依靠丈夫,于是丈夫越有钱,有能力,就能吸引更多的女性。按照流行的话说就是,我宁可坐在宝马后面哭,也不要坐在自行车后面笑。然而中国女性在依靠了丈夫后,却不希望如传统一般受到夫家家庭的约束。当然,实际上夫家的约束还是会发生的,就形成了新一代的婆媳冲突。这和传统的恶婆婆折磨媳妇并不尽相同,因为婆婆通常不是折磨媳妇,而是关于儿子的具体问题上,双方不能达成一致。 好吧,回到原题。如果你正在恋爱中,或者婚姻中。就别问你的伴侣,我和你妈掉到水里你先救谁。你得不到想要的答案,对方一定会顾左右而言它。更神奇的是,我认识的人中,问过这个问题的人基本都受到了这个问题的折磨。所以,你最好不要问,而是祈祷这种问题永远不要发生。

关于IT雇员的一点话

Mar 24, 2011 - 1 minute read - Comments

IT是个很大的圈子,没人敢说什么都懂,也没人什么都懂。我们都有碰到不明白的时候,都得去查资料。一个人力资源方面的有趣的问题是,公司该不该为查资料的时间付钱呢? 技术上说,IT人员查资料是一个自我学习的过程,公司既不从中受益,也就没有为此支付薪水的必要。然而我们都忽略了一件事情,就是你招聘的员工,究竟是一个新手呢?还是一名领域上的专家。如果是领域上的专家,我得说这个技术上的说法是成立的。因为你在招人的时候,就已经知道对方的身份。并且,可以合理的假定,对方基本不用去查找资料,或者学习一些新的东西。当然,实际执行的时候,偶尔还是会发生这样的事情,不过这就不重要了。 然而多数公司没有这样的好运,好运这个词包括招聘的价格和高昂的招聘运作过程。天天投简历尚找不到工作的人也许无法理解,一个公司要招聘一个靠谱的员工到底有多困难。在IT的某个子领域,例如某种数据库大规模集群性能优化。能够谈的上足够专家,有一定经验,从而避免大部分的学习和资料查找的人,在中国的人力市场上大约也就是几千人。平摊到广袤的中华大地上,在上海的专家不足一千,不少还在大公司里。当一个公司真的需要一个能做事的人的时候,几乎没有可能找个专家过来,甚至在比较生僻的领域中连有一定经验的人都极为抢手。即便是比较通俗的java程序员,专家的招聘难度虽然不高,但是工作成本却不低。雇用一批专家来写程序是件很低效的事情。 大多数公司会雇用一批合适的人,这批人通常是高校毕业,有工作经历。这些经历可能是学校中的,也可能在小公司工作了一年。无论如何,他们会使用工作中所需要的技术,却绝对不能称作熟练。他们没有足够的经验写出工业化的程序,而且会花费大量时间查阅资料,自我学习。也正是如此,公司支付的薪水也是非常低廉的。 好,我们回到最初的问题上。我认为对于这些普通员工,公司实际上是以降低价格的方式,来让他们为学习买了单。如果再要求他们不能在工作时间查阅资料自我学习,无疑是苛求。相反,对于这些尚未成熟的程序员,最好增加公司培训,以补充高级程序员的缺口。当然,实际执行的时候必须考虑到培养成本和违约问题,考虑一些比较可控的培养方式。在中国常见的情况是,程序员培养好了,人也跑了。 说到这里,想起一个台湾朋友和我说的。虽然我们(指台湾员工和大陆员工)的能力差不多,但是台湾人,新加坡人拿的就是比大陆人多。有些人就觉得是有歧视,其实不是的。老板要求的是一个稳定的人来做事,他和我说好了两年不能离开,我就准备工作两年。他们老板我也聊过,的却向我抱怨过大陆这里招到人,培训好了人就跑了的情况。正是因为我们每个人的小小聪明,造成我们的整体信用不佳。老板不敢用,也不敢培养大陆的员工,总觉得有一天会被他们放鸽子。这种情况下我们发展到领域高阶职位就越来越难。很多东西必须是坐在那个位置上才会学到那些东西,就是所谓的“居移体养移气”。对于员工来说,长期在一些低端职位做一辈子,也是学不到高阶位置所要的东西的。大陆员工不比别人笨,但是人家一出来就做到管理者位,我们则是坐在了工位上。于是在此后几十年的人生长跑中,差距就越拉越大。 怎么办?我不是教人怎么办的,我只是说行业里面的一些现象。

approx无法升级问题的解决

Mar 23, 2011 - 1 minute read - Comments

approx最近不知道怎么回事,无法升级。每次aptitude update都无任何升级提示。而直接指向mirrors是可以升级的。 其实,去缓存目录下删除Release和Release.gpg就好了,通常是在/var/cache/approx下面的debian/testing/下面,testing是你的/etc/apt/source.list中指名的发行。

乘飞机的几个提示

Mar 21, 2011 - 1 minute read - Comments

1.飞机的登机过程是,买机票。提前起飞小时一个半小时到机场。到值机柜台划位,托运行李,更换登机牌。过安检,到登机口等待登机。登机,并等待飞机起飞。下面的过程就比较不固定,大概是,天气原因飞机延误,航空管制飞机延误,不广播原因飞机延误。注意!民航规定,飞机延误四个小时以上的,不问理由,必须赔偿。当然,战争之类的不可抗力不算。天气算不算不可抗力,这是一个很有意思的问题。 2.记得携带身份证,没有身份证是上不了飞机的,而且后果自负。 3.机票通常越早订越有折扣,临起飞前一天往往已经没有折扣了。 4.根据机场和航班的不同,通常要求你提前到一定的时间。以北京首都国际机场为例,国航的要求是提前一个半小时到机场。这并不是说你没有提前一个半小时就无法上飞机,只是说如果迟到后果自负。当然,这个时间越长,你越找不到航空公司的麻烦。所以不要相信这个时间,傻傻的去等着。在你熟悉机场的情况下,可以估算一下提前多久。飞机的值机柜台关闭大概是起飞前30分钟,后面就是等候柜台办理了。登机关闭大约在飞机起飞前10分钟,两者会根据你的登机口距离和飞机距离有所变化。只要你在合适的时间赶到,都可以顺利上飞机。当然,如果机场并不熟悉,还是早点到的好。不知你是否能够想象,有的时候机场外面出租车会排起长达一个多小时的长队,例如以前的虹桥机场在周一早上的时候。所以要稍微清楚一点到机场的方式和可能被延误的时间。通常越不稳定的交通方式,越早到机场以防万一。 5.知不知道最好的座位在哪里?走道机窗各有所好,但是公认的最佳座位在紧急通道旁边一排。首先是,根据统计,这里的逃生概率最高,坐在这里等于具有额外的命。其次,由于为了逃生原因,所以座位和前面的距离比正常的宽一些,坐起来比较舒服。 6.如果你迟到了,值机柜台关闭了。你自己估计赶的上飞机,可以向候补柜台申请。最好没有行李,因为重新开启行李通道比较麻烦,工作人员一懒,你就上去不了。当然,平时也是尽量少带托运的好,拿行李也很麻烦。 7.在过安检的时候,记得不要带凶器,不要带液体,不要带火。有电脑的拿出电脑,尽快的把东西放在篮子里面过去。被安检人员发现违规是最麻烦的事情,你要么回去重新托运,要么当场丢掉。 8.在紧急的情况下过安检,你可以向工作人员申请急客通道。有的机场让你从机组和头等舱通道过去,也是一样的。目的是减少你过安检的时间。当然,你最好不要用到这条。 9.检票登机的时候不要着急,登机牌上的座位是固定的,你不高兴没人会抢。早早的排队登机只会增加你的排队时间。 10.到座位后,把东西放上行李架就赶快坐下,后面的人还要过去。文明点,谦让点,下次也会有人让你过去。 11.飞机起飞的时候有快速升高,这时候会产生压耳现象,尤其是当你感冒的时候。有些人可以自主调节欧式管,从而消除压耳现象(贝壳就可以)。有些人就不大会,从而发生耳鸣,听不到声音,耳痛什么的。别担心,喝点热水,嚼一下口香糖会好转的。 12.很偶然的情况下,飞机内舱压会略略失常。有些人会发生头晕,头痛,耳鸣(和压耳完全是不同感觉),疲劳等高原反应。在贝壳数百次飞行中,只发生过一次这样的现象。这时候没什么好办法,尽量睡着吧。高原反应药是来不及了,严重可以吸氧。

debian是什么

Mar 20, 2011 - 1 minute read - Comments

debian是一种开源的操作系统,其内核理论上是可变的,主要有linux/freebsd/hurd三种。但是目前为止,主要被采用的都是linux内核,大部分都是基于i386或x86_64编译。 debian系统使用一种被称为deb的打包格式,这种格式中声明了依赖性问题,但是没有解决。所谓依赖,是指一个包内不包含运行所需的所有组件。例如特定版本的lib,辅助配置程序等。将依赖分离有助于多个包共享一份被依赖程序,并且几个组件可以独立升级。windows中通常将依赖包加入安装包内部,但是这样往往不利于被依赖程序的升级。(windows的二进制兼容性做的并不很好)如果没有打入安装包,windows中通常表现为安装一个程序的过程中提示你需要安装某个东西,请去哪里下载。debian的依赖是依靠一套被称为apt的系统解决的。在这套系统中,你可以指定一个源(debian mirror),或者多个源。apt系统会自动将上面所有软件的目录下载下来供你查阅安装。如果有依赖性问题会自动安装依赖的包。因此,配置好的apt系统相当于一个软件仓库,里面有很多程序。你可以选择其中的一部分,安装使用,而无须忧心安装过程。 apt的更新分为三部分,一部分是这个源中有哪些包,这些包的元信息(meta info)。包括这些包的名字,版本,所依赖程序的版本等。当一个源获得了新的软件的时候,就会更新这个列表,或者叫目录。客户端更新目录后就可以发现,有哪些包需要更新或者下载。而另一部分则是这些包文件本身。最后一部分是以上内容的签名。在元信息上有包文件的校验,而元信息本身则被一个非对称密钥签名。这个签名由apt的管理者签署,从而保证只有受到管理者认可的包会被客户安装,其他恶意插入的包都会被警告。 debian系统默认是没有图形界面的,也没有ssh操作界面,debian的基础系统甚至没有一个可启动的内核。基础系统中只包含了一个文件结构,和被简单配置能够自我管理的apt系统。最精简系统在基础系统之上,安装了内核和引导管理器,从而保证在某个系统上可自启动和自引导。debian的businesscard安装包包含了一个建立其他精简系统所需的所有工具的集合,而netinst安装包则增加了建立最小系统所需的镜像。两者的区别在于,businesscard必须联网以下载最小系统所需的所有安装包,而netinst可以从光盘上获得这些包。 当然,这离一个完整的系统还差很远。作为服务系统,必须安装ssh以便于远程管理。作为桌面系统,需要安装X,WM,还有其他应用程序。甚至,作为网络系统,基础的网络配置组件都是默认不完整安装的。你必须设定网络,设定源,然后更新列表,而后安装合适的程序。这一切对于初学者非常不友好,所以debian还有一种gnome标准安装包,在光盘上放了建立一个标准系统所需的所有包。你可以在不联网的情况下,自动建立起一个标准的桌面。 debian的特性是非常强的自我定制,虽然从根本上说,gentoo的定制方式才是极限。但是长期滚动编译对维护而言是一个非常大的挑战(debian的维护方式都会让很多公司感到不舒服)。debian可以很方便的直接定制一个特制化系统,而跳过编译过程。这对于自己需要一定程度定制的高级linux用户非常有吸引力。