python高級-代码优化

一、函数返回值缓存

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
(二)不要重复造轮子
  • itertools 详解
  • collections 详解
  • 内置函数:map()
    推荐使用。。。
(三)学会使用队列
(四)1比True好
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值