一、函数返回值缓存
class memoization:
known = dict()
'''用这个装饰耗时0.5秒'''
def __init__(self, fn):
self.fn = fn
def __call__(self, *args):
if args not in self.known:
self.known[args] = self.fn(*args)
return self.known[args]
@memoization
def fbnq(n):
assert(n >= 0), u'n必须大于等于0'
return n if n in (0, 1) else fbnq(n - 1) + fbnq(n - 2)
if __name__ == '__main__':
from timeit import Timer
t = Timer('fbnq(10)', 'from __main__ import fbnq')
print(t.timeit())
二、函数查询表
(一)用列表或链表做查询表
注意:在这种情况下,链表比普通列表性能高,但是链表的类型也会对性能产生影响。
(二)用字典做查询表
注意:只要每次生成不同的键,这个算法才是有效的。但是,随着字典的规模不断增大,碰撞频繁,性能会下降。
(三)二分查找
注意:这种算法只有在有序的条件下才能使用。处理长的列表,效率会很高。
三、列表表达式和生成器
四、ctypes
(一)介绍
ctypes库可以直接让开发者进入python底层。借助C语言的力量去开发。
这个库只有官方版本(Cpython)才有。
(二)加载自定义ctypes
加载一个系统库,这个库不需要自己手写C函数。
随机产生100w个随机数:
import time
import random
from ctypes import cdll
# libc = cdll.msvcrt # windows系统
libc = cdll.LoadLibrary('libc.so.6') # linux系统
init = time.clock()
[random.randrange(1, 100) for x in xrange(1000000)]
print 'python version:%s seconds' % (time.clock() - init)
init = time.clock()
[(libc.rand() % 100) for x in xrange(1000000)]
print 'C version:%s seconds' % (time.clock() - init)
五、字符串连接
word_list = ['apple', 'banana', 'orange']
full_str = ''
for word in word_list:
full_str += word
# 下面比上面更容易阅读,书写方便,内存和时间消耗更少。
''.join(word_list)
六、python小窍门(内部运作方式)
(一)成员关系测试
for a in b 时,这个b尽可能为set或者dict