[ Content | Sidebar ]

Posts tagged python

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")
Copy Code 

———–
post by gmail~

平衡点算法备忘

原文:http://www.javaeye.com/topic/600079
各种语言,各种算法,下面总结成python

#!/usr/bin/env python
 
def bl1(nums):
    for i in xrange(1,len(nums) - 1):
        if sum(nums[:i]) == sum(nums[i+1:]):
           return i, nums[i]
    return None
 
def bl2(nums):
    total = sum(nums)
    left = 0
    for i in xrange(1,len(nums) - 1):
        left += nums[i-1] 
        if (left == total - left - nums[i]):
            return i, nums[i]
    return None
 
def bl3(nums):
    head_sum = 0
    end_sum = 0
    head = 0
    end = len(nums) - 1 
    add_head = True
    add_end = True
 
    while head < end:
        if add_head:
            head_sum += nums[head]
 
        if add_end:
            end_sum += nums[end]
 
        if head_sum < end_sum:
            head += 1
            add_head = True
            add_end = False
        elif head_sum > end_sum:
            end -= 1
            add_head = False
            add_end = True
        else:
            head += 1
            end -= 1
            add_head = True
            add_end = True
 
    if head_sum == end_sum: 
        return head, nums[head]
    else:
        return None
 
test = [1,3,5,7,8,25,4,20]
print bl1(test)
print bl2(test)
print bl3(test)
Copy Code 

———–
post by gmail~

终于可以直接在vim里编辑日志了

最终我还是给blogo2增加了一个不实用的通过邮件编辑日志的功能,需要加一个#edit:BLOGID的标记,但是因为邮件客户端跟本不知道已发blog的id,所以功能略显鸡肋。这绝对是我专用的功能,在bin目录又加了一个小命令,只需在vim里输入:r!wpblog bluehua.org 便可以把最新的blog拽回来,包括blogid

wpblog的内容

#!/usr/bin/env python
import sys 
import xmlrpclib
import getpass
import os
 
'''
A simple tool for dump blog powered by wordpress
For example: in vim, dump the last webblog into current buffer
:r!wpblog myblog.domain
'''
 
#make sure the stderr is the control terminal 
if os.name == 'posix':
    sys.stderr = open('/dev/tty', 'a')
 
if len(sys.argv) < 2: 
    print >> sys.stderr,'''
Usage:
wpblog myblog.domain [blogid]
    '''
    exit(1)
 
rpc = 'http://%s/xmlrpc.php' % sys.argv[1]
 
print >> sys.stderr, '\r\nUsername:'
user = raw_input()
passwd = getpass.getpass('Password:')
 
api = xmlrpclib.ServerProxy(rpc)
 
try:
    if len(sys.argv) > 2:
        blog = api.metaWeblog.getPost(sys.argv[2], user, passwd)
    else:
        blogs = api.metaWeblog.getRecentPosts('', user, passwd, 1)
        if not len(blogs):
            print >> sys.stderr, 'no blog returned~'
            exit(1)
        blog = blogs[0]
except xmlrpclib.Fault, ex:
        print >> sys.stderr, ex.faultString.encode('utf-8')
        exit(1)
 
print '#cats:%s' % u','.join(blog['categories']).encode('utf-8')
print '#tags:%s' % blog['mt_keywords'].encode('utf-8')
print '#edit:%s' % str(blog['postid'])
print blog['description'].encode('utf-8')
Copy Code 

———–
post by gmail~

找到Flash Media Server的替代品~

很早之前就想实现一个在线录音的功能,无奈一直没有找到FMS的替代品。以前用”flash 录音”两个关键词,结果大多是FMS实现,还有个开源的Red5,java实现的,还是算了,vps上跑java。。偶尔换了个高级点的关键词”python rtmp”立刻找到我想要的:http://code.google.com/p/rtmplite/ 。rtmplite实现了一个简单的RTMP server,而且只用了3个python文件,(Red5都有三十几兆。。)

ls -lh amf.py multitask.py rtmp.py 
-rwxr-xr-x 1 lu lu 17K 2010-07-30 12:31 amf.py
-rwxr-xr-x 1 lu lu 41K 2010-06-29 07:28 multitask.py
-rwxr-xr-x 1 lu lu 51K 2010-07-30 09:42 rtmp.py
Copy Code 

实现的在线录音功能:http://v.hua.lu

———–
post by gmail~