Python常见问题及资料收集
1,字符编码处理: http://bbs.chinaunix.net/thread-1431029-1-1.html
2,List/Queue/deque/queue
- queue是多线程中的,使用的栈;由于有全局计时器锁的存在,多线程并不能改善程序性能;线程安全(GIL保证)。
- multiprocessing.Queue是Python2.6版本引入的,用于实现多线程的一种高性能栈;线程和进程安全。
- collection.deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈,插入和删除性能完胜queue和Queue,使用c语言实现;线程安全(GIL保证)。
3,yield和generator
- generator(生成器),是一个特殊的程序,可以被用作循环的迭代行为。类似于返回值为数组的一个函数,这个函数可以接受参数,可以被调用,但是不同于一般都函数会一次性返回所有数值的数组,生成器一次只产生一个值,这样消耗的内存大大减小,而且允许调用函数可以很快的开始处理前几个返回值。因此,生成器看起来像一个函数,但是表现像一个迭代器。
- 生成器与迭代协议是密切相关的
- python提供了两种基本方式来构造生成器:
- 生成器函数:也是用def来定义,利用yeild关键字一次返回一个结果,阻塞,重新开始。为了支持迭代协议,拥有yeild的函数会被编译成生成器,这类函数被调用时返回一个生成器对象,这个对象支持迭代接口,即成员方法__next()__继续从中断处执行。
-
# coding def cube(n): for i in range(n): yeild i ** 3 for i in cube(5): print i # output 0 1 8 27 64
-
- 生成器表达式:返回一个对象,这个对象只有在需要的时候才产生结果
-
>>> # 列表解析生成列表 >>> [ x ** 3 for x in range(5)] [0, 1, 8, 27, 64] >>> >>> # 生成器表达式 >>> (x ** 3 for x in range(5)) <generator object <genexpr> at 0x000000000315F678> >>> # 两者之间转换 >>> list(x ** 3 for x in range(5)) [0, 1, 8, 27, 64] >>> # 使用for循环自动发出next()函数,实现自动迭代 >>> for n in (x ** 3 for x in range(5)): print('%s, %s' % (n, n * n)) 0, 0 1, 1 8, 64 27, 729 64, 4096 >>>
-
- 生成器函数:也是用def来定义,利用yeild关键字一次返回一个结果,阻塞,重新开始。为了支持迭代协议,拥有yeild的函数会被编译成生成器,这类函数被调用时返回一个生成器对象,这个对象支持迭代接口,即成员方法__next()__继续从中断处执行。
- 比较。一个迭代器既可以被写成生成器函数,也可以被写成生成器表达式,均支持自动和手动迭代。而且这些生成器只支持一个active迭代,也就是说生成器的迭代器就是生成器本身。
4,协程、Gevent、Greenlet
5,multiprocessing、threads实现的并行比较