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())
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

二、函数查询表

(一)用列表或链表做查询表

注意:在这种情况下,链表比普通列表性能高,但是链表的类型也会对性能产生影响。

(二)用字典做查询表

注意:只要每次生成不同的键,这个算法才是有效的。但是,随着字典的规模不断增大,碰撞频繁,性能会下降。

(三)二分查找

注意:这种算法只有在有序的条件下才能使用。处理长的列表,效率会很高。

三、列表表达式和生成器

列表推导式详见:列表推导式
生成器详见:生成器

四、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)
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

五、字符串连接

word_list = ['apple', 'banana', 'orange']
full_str = ''
for word in word_list:
    full_str += word
# 下面比上面更容易阅读,书写方便,内存和时间消耗更少。
''.join(word_list)
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

六、python小窍门(内部运作方式)

(一)成员关系测试

for a in b 时,这个b尽可能为set或者dict
    
    
  • 1

(二)不要重复造轮子

  • itertools 详解
  • collections 详解
  • 内置函数:map()
    推荐使用。。。

(三)学会使用队列

(四)1比True好

        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
            </div>

一、函数返回值缓存

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())
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

二、函数查询表

(一)用列表或链表做查询表

注意:在这种情况下,链表比普通列表性能高,但是链表的类型也会对性能产生影响。

(二)用字典做查询表

注意:只要每次生成不同的键,这个算法才是有效的。但是,随着字典的规模不断增大,碰撞频繁,性能会下降。

(三)二分查找

注意:这种算法只有在有序的条件下才能使用。处理长的列表,效率会很高。

三、列表表达式和生成器

列表推导式详见:列表推导式
生成器详见:生成器

四、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)
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

五、字符串连接

word_list = ['apple', 'banana', 'orange']
full_str = ''
for word in word_list:
    full_str += word
# 下面比上面更容易阅读,书写方便,内存和时间消耗更少。
''.join(word_list)
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

六、python小窍门(内部运作方式)

(一)成员关系测试

for a in b 时,这个b尽可能为set或者dict
  
  
  • 1

(二)不要重复造轮子

  • itertools 详解
  • collections 详解
  • 内置函数:map()
    推荐使用。。。

(三)学会使用队列

(四)1比True好

        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
            </div>

猜你喜欢

转载自blog.csdn.net/myword1314/article/details/81569675