文章标签 » python

发现一个好用的python版js压缩工具

https://github.com/rspivak/slimit
灰常好的工具,压缩比高,代码兼容性好,可媲美主流压缩工具~
做了下简单的benchmark:

#raw
256K jquery-1.8.1.js
#download from jquery.com
 92K jquery-1.8.1.min.js
 36K jquery-1.8.1.min.js.gz
#http://closure-compiler.appspot.com
 84K jquery-1.8.1.google.advanced.js
 32K jquery-1.8.1.google.advanced.js.gz
 92K jquery-1.8.1.google.simple.js
 36K jquery-1.8.1.google.simple.js.gz
#http://dean.edwards.name/packer
120K jquery-1.8.1.packer.js
 40K jquery-1.8.1.packer.js.gz
#http://refresh-sf.com/yui
#Uncaught SyntaxError: Unexpected token } 
 64K jquery-1.8.1.yui.js
 24K jquery-1.8.1.yui.js.gz
#slimit
 96K jquery-1.8.1.slimit.js
 36K jquery-1.8.1.slimit.js.gz

yui的虽然最nb,拉开其他工具一大截,但是压出来已经不能用了,难道是我点击提交按钮的方式不对??

实际使用时,我用的环境是redhat5.x,python环境较为恶劣,slimit只兼容到python 2.7,于是单独做了一个”便携版本”,可以兼容到2.4,并且相关依赖也放到一起,下载即用:)
https://github.com/emptyhua/js-css-minify-portable

python产生GMT格式日期时间

#缓存一天
exp = datetime.timedelta(seconds=86400)
now = datetime.datetime.utcnow()
req.setHeader('Cache-Control', 'max-age=86400')
req.setHeader('Expires', (now + exp).strftime('%a, %d %b %Y %H:%M:%S GMT'))

———–
post by Email~

PPJ回忆录

个人以为:学一门脚本很容易,但是学几门就是一个痛苦的事,因为我经常把他们搞混。。

于是我下决心写一个能够帮我理清楚的文档,我命之为《PPJ回忆录》,从周5写到今天,精疲力尽,剩下OO和正则部分没写,我决定先歇会~

毫不客气的说,对于同时学里面任意两门语言的同学,这个文档都会对你有帮助。

———–
post by gmail~

unamed

转一个牛人的经验贴
—————
发信人: SlutteryWolf (一生懸命|情色·猥琐·变态·双子狼), 信区: Python
标 题: Tornado的实现还是很强大的
发信站: 水木社区 (Wed Jan 5 13:19:28 2011), 转信

这段时间自己把iostream.py实现了一下,顺便给socket打了个补丁,发现了好几个
有趣的点:

1. socket的C实现中,对于recv函数,直接返回新生成的字符串比传入缓冲区写还要
快。 大概能快10%。代码稍后附上,大家可以自由cProfile (./python -m
cProfile yourcode.py)。

2. Python的速度大大逊于原生代码。
用cProfile做了些调优后的感想。不过大家用Python都是冲着顺手易用去的,所以这
一点倒也无可厚非。

3. Python的List(含string)操作是高度优化过的。
我曾经试图用自己管理的bytearray缓冲区来替代原生的string,因为源代码里面包
括了大量的+=和区段赋值操作,以提高性能。
但是我错了,而且错的很离谱。
现在的bytearray1[x:length] = bytearray2[y:length]操作和我自己写的
memcpy(bytearray2, y, bytearray1, x, length)几乎一样快。
而且如果是反复调用string_a += random_string_b,并不会每次重新分配内存并做
拷贝操作,和预先分配一块内存做搬运基本一样快。

4. 函数调用在Python里面的开销是不小的。对于较为关键的代码,建议手工
inline。当然如果对性能要求再高建议直接C.

5. 用 not not collection_var 来代替 len(collection_var) > 0 的判断语
句。

6. 对于deque,访问deque.popleft,然后根据判断再deque.appendleft,比直接
deque[0]要快。

总之,Tornado的实现考虑到了以上中的大部及重点,如1和3. 它的实现蛮强大,大家
放心使用。。。

———–
post by gmail~

ip2long python版

def ip2long1(ip):
    hexn = ''.join(["%02X" % long(i) for i in ip.split('.')])
    return long(hexn, 16)

def ip2long2(ip):
    lngip = 0
    for q in ip.split('.'):
        lngip = (lngip << 8) | int(q)
    return lngip

if __name__ == '__main__':
    print ip2long1("173.230.156.208")
    print ip2long2("173.230.156.208")

-----------
post by gmail~