转一个牛人的经验贴
—————
发信人: 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~
原文: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~
最终我还是给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~
很早之前就想实现一个在线录音的功能,无奈一直没有找到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~