标签:python

浏览模式: 标准 | 列表 | 图文
python的八荣八耻

python的八荣八耻

不要惊讶我将它放到PHP分类里,这是我在啄木鸟社区上看到的,看看那些在python上坚持了这么多年的人,在学习领会胡主席的八荣八耻后,对自己的要求:

以动手实践为荣 , 以只看不练为耻; 以打印日志为荣 , 以单步跟踪为耻; 以空格缩进为荣 , 以制表缩进为耻; 以单元测试为荣 , 以人工测试为耻;  以模块复用为荣 , 以复制粘贴为耻; 以多态应用为荣 , 以分支判断为耻; 以Pythonic为荣 , 以冗余拖沓为耻; 以总结分享为荣 , 以跪求其解为耻;

原文地址在:http://wiki.woodpecker.org.cn/moin/Py8Rong8Chi

我是觉得可以适用于任何语言。当然pythonic之类的就需要套用自己当前语言了。

yhustc:Twisted+AC自动机构建高效的过滤服务器

这是yhustc帮烂桔搞定AC自动机的过程。上次在PHPX上看到也有人用PHP实现了一个,但我估计在大并发的时候,效率也不会高到哪里去。PHP纯处理字符串效率毕竟还是不咋地。。如果用perl呢?没试过。。。。还是看一下yhustc怎么实现在的吧。
yhustc的网址是:http://www.yhustc.com ,yhustc在文中还提到了twisted,我没用过这个玩意,后来google了一下,发现还是很迷糊。
原文内容如下:

橘子有个网站,访问量大约每天500万PV,为了怕被屏蔽,需要对一系列敏感词进行过滤(超过1200个词),然后才输出内容给用户。

替 换给定关键词的功能,每种编程语言都有,PHP的最强大。基于正则匹配替换的大家都有,就不提了。基于精确匹配的字符串替换,PHP的 str_replace函数可以根据给定的数组,一次函数调用对多关键词进行匹配。自然橘子用的也是这个咯(如果使用的是for i < 1200 顺序的循环,基本系统效率可以无视了)。可是现在问题出现了:系统负载非常高,而且是持续的高,晚上10点的高峰期CPU一直100%的满负荷运行。

要优化性能,就需要一步步的分析瓶颈在什么地方:

1、 由于橘子说有些关键词以后没准会解封,所以不想把原始内容就保存为带上一堆****这样子。因此原始内容都保存的好好的,那么给用户输出的,是每次过滤过 后的结果。那么这里自然有个问题,就是相同的内容,针对每个用户都被过滤了一次,这不明摆着的CPU浪费嘛。我说你可以考虑空间换时间, 加硬盘后上缓存,一定时间内都只过滤一次,其他用户都读缓存即可,这样计算开销几乎全部省下来了。但是橘子哭穷啊,SSD的硬盘两千多一块。IDE的插上 去就得给机器断点,现在百度正在考验自己的站点,这个电断不得(如果IDC够好的话,夜里换其实没啥问题,偏偏他的IDC技术不照)。那行,看来还是只能每次都过滤了,你爱折腾我也没办法。

2、分析一下PHP的str_replace,他既然支持多关键词的数组输入,说明内部肯定是一个AC自动机。 什么是AC自动机,大家请自行google并学习,我就不长篇大论了。本来多关键字替换的应用,AC自动机是最好的选择,但是为啥他的服务器负责就是居高 不下呢?这与PHP的实现机制有关,PHP的生命周期是一个WEB请求,那么每个用户请求页面时,调用一次str_replace。即使输入的数组是一摸 一样的,也必须重新构建一个AC自动机的搜索树,这个搜索树初始化的计算开销以及内存开销乘以并发数,严重降低了系统性能。(也不全是PHP生命周期引发 的,主要是因为AC自动机是封装在str_replace内部实现的,即使是串行的调用,相同输入仍然会每次都初始化自己的搜索树)

那么我们现在的问题就很明确了:实现一个全局的AC自动机,用他来处理所有的请求即可。这个任务PHP是没法执行了,加之要找AC自动机的相关模块才能自己二次开发,选定了python来干这个事情。https://hkn.eecs.berkeley.edu/~dyoo/python/ahocorasick/ 这里是python的AC自动机的模块,非常的简单易用,看看就会。

读 取关键词列表,添加关键词,构建搜索树,OK!测试一下关键词的搜索效果,windows平台下10000次的循环搜索,python的程序比直接用 PHP的str_replace执行时间缩短了200倍,当时震惊的一塌糊涂!!(不过这跟PHP在windows平台执行效率低也有关系,linux上 面明显要快非常多)

话不多说,把python的程序封装到一个Socket TCP Server里面,这样便于WEB的PHP程序通过套接口请求服务,把原文发过来,过滤后又发回去,这样就实现了一次过滤。

高高兴兴的把程序发给橘子,结果一上服务器,反而比先前的PHP str_replace效率还差。

3、这时候才想到一个问题,我做的测试是串行执行的,只能算运行总时间。如果要上web上面应用,需要考虑并发问题。也就是需要ab测试。ab -c 500 -n 500测试了一把,果不其然,效率忒低。继续分析,我觉得是高并发情况下,python那个简单封装的TCPServer不够用。线程开销和阻塞式的服务 模式拖低了系统效率。为什么会有这种问题,请问自己“你写的http server能跟apache比不?”这里面的性能优化太高深,搞不明白,怎么办呢?我们需要站在巨人的肩膀上才行。于是想到可以用Twisted库来构建自己的TCP Server。什么是Twisted?也请自行google,并且学习一下。

把TCP的服务器用Twisted改写了之后,AB测试了一把,大大的有惊喜:

PHP的str_replace版本

ab -c 500 -n 500 str_version.php
Requests per second: 165.86 [#/sec] (mean)
Time per request: 3014.552 [ms] (mean)
Time per request: 6.029 [ms] (mean, across all concurrent requests)

PHP + python的旧版本的tcp server + AC自动机

ab -c 500 -n 500 old_ac_filter.php
Requests per second: 165.06 [#/sec] (mean)
Time per request: 3029.286 [ms] (mean)
Time per request: 6.059 [ms] (mean, across all concurrent requests)

PHP + python的twisted版本的tcp server + AC自动机

ab -c 500 -n 500 twisted_ac_filter.php
Requests per second: 620.93 [#/sec] (mean)
Time per request: 805.246 [ms] (mean)
Time per request: 1.610 [ms] (mean, across all concurrent requests)

高并发的情况下,每秒处理的请求数提升了4倍,效果那不是盖的。

晚上十点,又迎来了一个访问量的高峰,情况非常稳定,橘子回报:

“之前这个点都是满负载跑-,- -v-而且还是关闭了在线统计功能的情况下”

“现在我把在线统计打开了,cpu也就50%左右”

反正是够用了,就优化到此为止吧。

其实这个需求,还有进一步优化的余地,空间换时间+全局的AC自动机,可以把系统性能提高若干数量级。

大 致思路是:在内容刚刚产生的时候PHP通过UDP消息把需要处理的东西发送给python程序,python实现一个两个线程的生产消费者模式的工作进 程。消费线程每次取出消息槽里面一个需要处理的请求,使用一个全局的AC自动机对内容进行处理,然后存放起来,继续处理下一个请求,当没有请求的时候就阻 塞住。生产线程是一个UDP的server,收到数据后就给消息槽添加一个请求数据,并且给消费线程发送信号激活它工作。如此往复即可。

--EOF--
小知识:
Twisted是一个事件驱动的网络框架,它由Python写成,基于MIT授 权协议。Twisted支持各种各样的底层协议,比如:TCP,UDP,SSL/TLS,多地址传输,Unix socket等,以及HTTP,NNTP,IMAP,SSH,IRC,FTP等其他高级协议。有了这些支持相当于有了一个强有力的基础,你可以用它来开发 诸如web server,Mail server,即时通讯软件 等等。

这里还有一个简单的教程(繁体字)

http://ez2learn.com/index.php/python-tutorials/twisted-tutorials

让PY在android上飞起来

让PY在android上飞起来

在这里【http://www.cnblogs.com/tieqixia/】看到SL4A的文章,是讲把python运行在andorid的文章 。好象那个php4android,也是基于这个SL4A的。

文章目前刚写了三篇,我根据第一篇里的建议,下载了这两个软件:python和sl4a,然后运行了那些样例代码。发现不太爽,因为每次运行,那个左上角的notify中还是显示SL4A的图标。

同时还有一个最大的疑问,如何把PY编译成APK,也没有什么 文章介绍。。

这个博客的第三节,有点意思,是讲如何简化输入,把PC上的代码,通过二维码扫描后,复制粘贴,然后保存到SL4A的编辑框 里。。

三篇文章如下:

1、让Python在Android系统上飞一会儿:第一节 在手机上配置Python运行环境

2、让Python在Android系统上飞一会儿:第二节 第一个有实用价值的应用

3、让Python在Android系统上飞一会儿:第三节 在电脑上编写程序在手机上运行

SL4A的下载地址是:http://code.google.com/p/android-scripting/

果然,正如我所说的,支持好多语言哦,其实就是做了一个类似于jre的中间件了,在SL4A的右上角有支持的语言列表,可以下载你熟悉的语言。

OK,不作做介绍了,自己看吧。

------

后记,在上篇的博客里,发现他介绍的豆瓣小组:http://www.douban.com/group/SL4A/,居然我还真的发现了这一篇:通过apk方式发行python脚本

心碎:pyscripter。。。

昨天说了一些关于python的编辑器的列表,当然是有一些IDE存在的,所以下载了一些,只是,让我失望的也有很多。比如这个pyscripter。。。
看截图,我很开心,好象挺不错的软件,但是下载回来后却发现无法运行。看了官方的CHM里面没有多介绍,只是说了一些:

PyScripter originally started as a lightweight IDE designed to to serve the purpose of providing a strong scripting solution for Delphi applications, complementing the excellent Python for Delphi (P4D) components. However, and with the encouragement of the P4D creator Morgan Martinez and a few early users, it has now evolved into a full-featured stand-alone Python IDE. It is built in Delphi using P4D and the SynEdit component but is extensible using Python scripts. Currently, it is only available for Microsoft Windows operating systems and features a modern user-interface. Being built in a compiled language is rather snappier than some of the other IDEs graphic and provides an extensive blend of features that make it a productive Python development environment.


在无法清楚官方想说什么的时候,去了google code上看了一下,居然还真的看到了这句话:
If you are using a 64bit version of Windows note that PyScripter will only work if a 32bit version of Python is installed.
好吧,不管是怎么样的情况,反正我64位的win7是肯定无法运行了。。。。
现在正在下载其他的,准备一个个的测试:http://wiki.python.org/moin/PythonEditors#Windows-OnlyEditors

Python学习资源

Python学习资源

学习Python的时候,还是翻了一些资料,也看到了一些资源。收集着,以后慢慢看。

http://woodpecker.org.cn/abyteofpython_cn/chinese/index.html
嗯,http://woodpecker.org.cn/,这个网上有很多Python的资源哦。
然后在这个网站还有这些链接哦

都挺不错。也几乎点开看了。。相对于这个,我其实更喜欢这样的CHM文件,

这两个链接里,可是有CHM文件下载的哦。

php2python

php2python

极有意思的网站,比较适合我们这些初学者,当然是对PHP有一些基础的初学者
网站主把常用的一些PHP的函数,用Python实现了一遍(或者是显示Python的自有函数),方便我们查找例子

例如:PHP常用的addslashes函数,用来对特殊字符进行转义,

该网站则显示:

def addslashes(s):
d = {'"':'\\"', "'":"\\'", "\0":"\\\0", "\\":"\\\\"}
return ''.join(d.get(c, c) for c in s)

s = "John 'Johny' Doe (a.k.a. \"Super Joe\")\\\0"
print s
print addslashes(s)
#John 'Johny' Doe (a.k.a. "Super Joe")\
#John \'Johny\' Doe (a.k.a. \"Super Joe\")\\\

实现方法虽然有点不一样,但对于我们这些初学者已经了解了很多用法,比如for in,join ,dict的get用法。当然还有定义函数的def方法。

这个网站是什么呢?http://www.php2python.com,黑黑,已经加入我的收藏夹了。感谢小缘缘的推荐

初学python

初学python

初学python,小缘缘出了几道题:
有一 list
a = [1, 2, 3, 4, 5, 6]
請將 a 依
0, 1
1, 2
2, 3
3, 4
4, 5
5, 6
打印輸出,
2.將a list 倒序成 [6, 5, 4, 3, 2, 1]
3.將a 中的偶數挑出 *2 ,結果為 [4, 8, 12]

基本上实现:

a=[1,2,3,4,5,6]

for i in a:
print a.index(i),',',i

a.reverse();

print a

for i in a:
if i%2==0
print i*2

虽然都完成了,但小缘缘说回答的不好,他这样回复

for k,v in enumerate(a):
print k,v
print a[::-1]
print [i*2 for i in a if not i%2]

当时我就傻眼了,后来缘缘又出了道题目:

造一個 200 個隨機正整數(1~15)的list
統計其中 正整數的出現次數,並排序輸出結果

开始的时候,不清楚random居然还要import。。。。

后来花了好久做出来:

>>> import random
>>> mylist = [random.randint(1,15) for i in range(1,200)]
>>> s={}
>>> for i in mylist:
if not s.has_key(i):
s[i]=0
else:
s[i]+=1


>>> cmplist = sorted(s.items(),key=lambda(d):d[1])
>>> result = cmplist[::-1]
>>> print result
[(8, 20), (13, 19), (12, 16), (9, 15), (6, 15), (3, 14), (2, 12), (14, 11), (4, 11), (15, 10), (7, 10), (11, 9), (5, 9), (1, 9), (10, 4)]

缘缘点评循环的时候,可以用Get比如

for i in mylist:
s[i]=s.get(i,0)+1

然后说sorted可以有从大到小的倒排,后来找了一下资料,发现可以这样

sorted(d.items(),cmp=lambda x,y:cmp(x[1],y[1]),reverse=True)

第一次写python,鸭梨太大了。。。

又拍网架构-又一个用到python的网站

又拍网架构-又一个用到python的网站

原文在这里:http://www.bopor.com/?p=652,我只是做个简单的转述。主要是因为这种架构在单台服务器上也可以做个参考,比如队列,当我一台服务器承受不了太大的访问时,我可以先把很多东西扔到队列里去,交由后台执行(当然是指一些比较重要而又不需要即时显示的。比如图片处理等 )

OK,不多说了,直接上原文的重点为:

分库设计,数据库拆分

最初是由一台主库和一台从库组成,当时从库只用作备份和容灾,当主库出现故障时,从库就手动变成主库,一般情况下,从库不作读写操作(同步除外)。随着压力的增加,我们加上了memcached,当时只用其缓存单行数据。但是,单行数据的缓存并不能很好地解决压力问题,因为单行数据的查询通常很快。所以我们把一些实时性要求不高的Query放到从库去执行。后面又通过添加多个从库来分流查询压力,不过随着数据量的增加,主库的写压力也越来越大。
怎么样对应用户和数据库呢?
· 按算法对应
· 按索引/映射表对应

分库会给你在应用的开发和部署上都带来很多麻烦。
· 不能执行跨库的关联查询
· 不能保证数据的一致/完整性
· 所有查询必须提供数据库线索
· 自增ID

如果要在节点数据库上使用自增字段,那么我们就不能保证全局唯一。这倒不是很严重的问题,但是当节点之间的数据发生关系时,就会使得问题变得比较麻烦。我们可以再来看看上面提到的评论的例子。如果photo_comments表中的comment_id的自增字段,当我们在DB- 2.photo_comments表插入新的评论时,得到一个新的comment_id,假如值为101,而User-A的ID为1,那么我们还需要在DB-1.user_comments表中插入(1, 101 …)。 User-A是个很活跃的用户,他又评论了User-C的照片,而User-C的数据库是DB-3。很巧的是这条新评论的ID也是101,这种情况很用可能发生。那么我们又在DB-1.user_comments表中插入一行像这样(1, 101 …)的数据。那么我们要怎么设置user_comments表的主键呢(标识一行数据)?可以不设啊,不幸的是有的时候(框架、缓存等原因)必需设置。那么可以以 user_id、 comment_id和photo_id为组合主键,但是photo_id也有可能一样(的确很巧)。看来只能再加上photo_owner_id了,但是这个结果又让我们实在有点无法接受,太复杂的组合键在写入时会带来一定的性能影响,这样的自然键看起来也很不自然。所以,我们放弃了在节点上使用自增字段,想办法让这些ID变成全局唯一。为此增加了一个专门用来生成ID的数据库,这个库中的表结构都很简单,只有一个自增字段id。当我们要插入新的评论时,我们先在ID库的photo_comments表里插入一条空的记录,以获得一个唯一的评论ID。当然这些逻辑都已经封装在我们的框架里了,对于开发人员是透明的。为什么不用其它方案呢,比如一些支持incr操作的Key-Value数据库。我们还是比较放心把数据放在MySQL里。另外,我们会定期清理ID库的数据,以保证获取新ID的效率。

我这里只有一个小纲要,更多还是看原文吧。

最后介绍一下Yupoo的资料:

作为国内最大的图片服务提供商之一,Yupoo! 的 Alexa 排名大约在 5300 左右。同时收集到的一些数据如下:
带宽:4000M/S (参考)
服务器数量:60 台左右
Web服务器:Lighttpd, Apache, nginx
应用服务器:Tomcat
其他:Python, Java, MogileFS 、ImageMagick 等

关于 Squid 与 Tomcat
Squid 与 Tomcat 似乎在 Web 2.0 站点的架构中较少看到。我首先是对 Squid 有点疑问,对此阿华的解释是”目前暂时还没找到效率比 Squid 高的缓存系统,原来命中率的确很差,后来在 Squid 前又装了层 Lighttpd, 基于 url 做 hash, 同一个图片始终会到同一台 squid 去,所以命中率彻底提高了”
对于应用服务器层的 Tomcat,现在 Yupoo! 技术人员也在逐渐用其他轻量级的东西替代,而 YPWS/YPFS 现在已经用 Python 进行开发了。

名词解释:
YPWS–Yupoo Web Server YPWS 是用 Python开发的一个小型 Web 服务器,提供基本的 Web 服务外,可以增加针对用户、图片、外链网站显示的逻辑判断,可以安装于任何有空闲资源的服务器中,遇到性能瓶颈时方便横向扩展。
YPFS–Yupoo File System 与 YPWS 类似,YPFS 也是基于这个 Web 服务器上开发的图片上传服务器。

【Updated: 有网友留言质疑 Python 的效率,Yupoo 老大刘平阳在 del.icio.us 上写到 “YPWS用Python自己写的,每台机器每秒可以处理294个请求, 现在压力几乎都在10%以下”】

图片处理层
接下来的 Image Process Server 负责处理用户上传的图片。使用的软件包也是 ImageMagick,在上次存储升级的同时,对于锐化的比率也调整过了(我个人感觉,效果的确好了很多)。”Magickd“ 是图像处理的一个远程接口服务,可以安装在任何有空闲 CPU资源的机器上,类似 Memcached的服务方式。
我们知道 Flickr 的缩略图功能原来是用 ImageMagick 软件包的,后来被雅虎收购后出于版权原因而不用了(?);EXIF 与 IPTC Flicke 是用 Perl 抽取的,我是非常建议 Yupoo! 针对 EXIF 做些文章,这也是潜在产生受益的一个重点。
图片存储层
原来 Yupoo! 的存储采用了磁盘阵列柜,基于 NFS 方式的,随着数据量的增大,”Yupoo! 开发部从07年6月份就开始着手研究一套大容量的、能满足 Yupoo! 今后发展需要的、安全可靠的存储系统“,看来 Yupoo! 系统比较有信心,也是满怀期待的,毕竟这要支撑以 TB 计算的海量图片的存储和管理。我们知道,一张图片除了原图外,还有不同尺寸的,这些图片统一存储在 MogileFS 中。
对于其他部分,常见的 Web 2.0 网站必须软件都能看到,如 MySQL、Memcached 、Lighttpd 等。Yupoo! 一方面采用不少相对比较成熟的开源软件,一方面也在自行开发定制适合自己的架构组件。这也是一个 Web 2.0 公司所必需要走的一个途径。

Python 3.0 一个巨大的改变

Python 3.0 一个巨大的改变

通常情况下,一个开发语言的新版本都会保持向后兼容原来的老版本,但是在2000年,Python语言的创始人Guido van Rossum宣布,他将跨入一个新的Python版本,3.0版本将不会向后兼容。现在Python 3.0 RC候选版本已经发布,正式版本将在这个月月底发布。

开发者也许会无法接受语言新版本的用法和老的代码不兼容,但是对于Rossum来说,激进的升级是必要的。语言如果能用无数种方式做同一件事情,那么应该做的工作没有人真正做到了。

3.0的发布是一个重要动作,Rossum说,这是要让python语言有更好的基础向前迈进。

Python 3.0 改变了什么?

从某种意义来说,Python已经成为自身成功的受害者。Rossum说,“最初的想法中,Python的使用范围很小,我真的没有想到Python是如此成功,正在各种各样的应用中使用,从web应用编程到科学计算,以及所有的一切类型程序。”

Van Rossum于1990年创建Python,作为一个开源,可扩展,高层次的语言,他还需要处理一些系统管理的职责。如今Python是世界上最流行的语言之一。08年3月,奥地利研究者Anton Ertl通过在新闻组发贴数量来统计语言的热门程度,Python排在第三位,仅次于C和Java之后。

今天,最容易来教别人如何编程的语言是python,python是使用起来最简单的语言之一,而且很优雅。

但是Python的简单正在遏制自己的增长,在整个90年代,不停有新的功能和属性进入python语言,但是不一致开始在整个平台上显现出来。 Rossum说,我们开始慢慢逝去了简单的优势,我们必须打破向后兼容性,停止语言定义的膨胀,虽然这种转变发生的非常缓慢,几乎难以察觉。

Python语法改变有一系列的列表,有些改变很小,可能被忽略,有些程序员可以迅速接受:比如去除print语句,加入print()函数实现相同的功能。同样的还有exec语句,已经改为exec()函数。去除了<>,全部改用!=。详细可以查看:Python 3.0 抢“鲜”体验。

如何转换?

Python 2.6作为过渡版本,2.6可以帮助开发者找到过时的程序代码,为3.0版本做准备,同时还有一个python 2.0到python 3.0的代码转换工具。

当然也有很多人置疑python 3.0是否必要,有可能升级被大多数不愿意转换老代码的开发商忽视,因此,它可能失去其地位,类似于微软的vista没有取代windows xp成为事实流行标准。

比如编写打印软件的Aahz Maruch负责的工程,Page DNA项目,有超过20万行代码需要转换,这是将是一个巨大的工作,Maruch说道,我们将等待几年后的自动翻译工具来改善,我们甚至没有谈到3.0,打算等它发布两三年以后。

今天Python主要的实现是CPython,这是一个用C写的Python翻译器,而且还有其他的Python实现,比如JPython(Python in Java),IronPython ( 用微软.net通用运行时语言编写的Python),以及PyPy(一个用 Python写的Python翻译器).

不管怎样,Python的核心开发团队对推广Python 3.0非常有信心,Rossum认为人们使用2.6从现在开始不到一年就会转移到3.0版本上,他同时建议:你如果开始一个新的Python项目,你绝对应该使用3.0.

让我们祝Python 3.0取得成功。
本文来自CNBETA.COM,原文:http://www.cnbeta.com/articles/67482.htm