python中的metaclass
摘要:首先看下面的代码:```python# coding: utf-8class Test(object): passprint Test.__class__ # typeprint Test.__base__ # objectt = Test()print t.__class__ ...
阅读全文
posted @
2015-07-04 00:37
inevermore
阅读(378)
推荐(0)
使用tornado的gen模块改善程序性能
摘要:之前在公司的一个模块,需要从另一处url取得数据,我使用了Python的一个很著名的lib,叫做requests。但是这样做极大的降低了程序的性能,因为tornado是单线程的,它使用了所谓的reactor模式,底层使用epoll监听每个tcp连接,上层再经过封装,接受HTTP请求。所以,tornad实际上是单线程的。 在实际的场景中,经常采用nginx反向代理的模式,然后服务器开启多个torn...
阅读全文
posted @
2015-03-18 21:17
inevermore
阅读(962)
推荐(1)
微信支付的开发流程
摘要:最近在公司做了微信支付的接入,这里总结下开发的一些经验 注意,我使用的是微信开放平台的支付,与手机app相关,而与公众账号无关。 微信支付的主要操作流程 1.用户浏览app,选定商品然后下单。 2.服务器处理订单逻辑,开始正式发起支付流程 3.首先,后台服务器向weixin服务器发起请求,获取一个token。 4.后台服务器拿到token,使用和其他参数加密,再...
阅读全文
posted @
2015-02-09 23:19
inevermore
阅读(1945)
推荐(1)
从range和xrange的性能对比到yield关键字(中)
摘要:上节提出了range和xrange的效率问题,这节我们来探究其中的原因 yield的使用 我们看下面的程序: #coding: utf-8 def test(): print 4 print 2 print 5 if __name__ == '__main__': test() 这段代码的运行结果当然是没有任何疑问的。 但是如果...
阅读全文
posted @
2015-01-14 22:03
inevermore
阅读(583)
推荐(0)
使用装饰器时带括号与不带括号的区别
摘要:之前我们在一个用于统计函数调用消耗时间的装饰器中写了一个装饰器,用于统计函数调用时间。代码如下: from time import time
from time import sleep def count_time(): def tmp(func): def wrapped(*args, **kargs): begin_time = ti...
阅读全文
posted @
2015-01-12 21:34
inevermore
阅读(1024)
推荐(0)
从range和xrange的性能对比到yield关键字(上)
摘要:使用xrange 当我们获取某个数量的循环时,我们惯用的手法是for循环和range函数,例如: for i in range(10): print i 这里range(10)生成了一个长度为10的列表,内容为从0到9,所以这里的for循环实际上是在遍历其中的元素。 如果循环次数过大的时候,range要生成一个巨大的列表,这将导致程序的性能降低。 解决方案是采用xr...
阅读全文
posted @
2015-01-11 19:04
inevermore
阅读(256)
推荐(0)
详解Python中的迭代器和使用
摘要:对于一个列表,a = [1, 2, 3, 4],我们最常见的遍历方式就是: a = [1, 2, 3, 4]
for item in a: print item 这里我们研究一种新的方式,就是迭代器。 在C++的STL中大量使用了迭代器,迭代器的作用当然就是遍历容器中的元素,而且他的好处就在于分离了容器的实现和遍历操作,不管我们使用什么类型的容器,使用迭代器的操作几乎是如出一...
阅读全文
posted @
2015-01-11 17:42
inevermore
阅读(653)
推荐(0)
使用Python发送电子邮件
摘要:使用python发送邮件并不难,这里使用的是SMTP协议。 Python标准库中内置了smtplib,使用它发送邮件只需提供邮件内容与发送者的凭证即可。 代码如下: # coding:utf-8
import smtplib
from email.mime.text import MIMEText
import time
import os
import sys def send_m...
阅读全文
posted @
2015-01-01 13:43
inevermore
阅读(343)
推荐(0)
一个用于统计函数调用消耗时间的装饰器
摘要:装饰器前面提过了,采用python的闭包特性实现: from time import time
from time import sleep def count_time(): def tmp(func): def wrapped(*args, **kargs): begin_time = time() result...
阅读全文
posted @
2014-12-30 21:31
inevermore
阅读(879)
推荐(0)
使用Tornado实现Ajax请求
摘要:Ajax,指的是网页异步刷新,一般的实现均为js代码向server发POST请求,然后将收到的结果返回在页面上。 这里我编写一个简单的页面,ajax.html 测试Ajax 点击 注意,从上面的代码可以看出,数据存储在“message”字段中。 所以后台从messag...
阅读全文
posted @
2014-12-29 23:16
inevermore
阅读(6344)
推荐(0)
使用tornado实现用户认证
摘要:关于用户的登录状态,一部分的应用程序是采用session实现的。 HTTP是一个无状态协议,用户的每次请求都是相互独立的,HTTP本身意识不到用户是否登录。 很多web框架选择将session存放在cookies中,本节我们也是这样实现: import tornado.ioloop
import tornado.web class BaseHandler(tornado.web.Re...
阅读全文
posted @
2014-12-29 21:54
inevermore
阅读(2174)
推荐(0)
Tornado框架中视图模板Template的使用
摘要:上文的程序中有这样一段: class MessageHandler(tornado.web.RequestHandler): def get(self): self.write(''' Please Input Message ''' ...
阅读全文
posted @
2014-12-28 20:12
inevermore
阅读(545)
推荐(0)
Tornado框架的初步使用
摘要:Tornado的搭建很简单,使用pip,或者下载源码均可。 我们先看一个最简单的程序: import tornado.ioloop
import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello World") appli...
阅读全文
posted @
2014-12-28 19:06
inevermore
阅读(349)
推荐(0)
使用Python实现生产者消费者问题
摘要:之前用C++写过一篇生产者消费者的实现。 生产者和消费者主要是处理互斥和同步的问题: 队列作为缓冲区,需要互斥操作 队列中没有产品,消费者需要等待,直到生产者放入产品并通知它。队列慢的情况类似。 这里我使用list模拟Python标准库的Queue,这里我设置一个大小限制为5: SyncQueue.py from threading import Lock
fro...
阅读全文
posted @
2014-12-28 14:36
inevermore
阅读(1465)
推荐(0)
Python实现快速排序
摘要:这里采用的是算法导论的划分方式: import random def partition(array, left, right): pivot = array[left] i = left #j left +1 -> right for j in range(left + 1, right + 1): if array[j] right
...
阅读全文
posted @
2014-12-27 22:10
inevermore
阅读(278)
推荐(0)
Python闭包的高级应用-装饰器的实现
摘要:我们先看一个闭包的例子: from time import ctime def before_call(f): def wrapped(*args, **kargs): print 'before calling, now is %s' % ctime() return f(*args, **kargs) return wrapped d...
阅读全文
posted @
2014-12-27 21:44
inevermore
阅读(483)
推荐(0)
Python之闭包
摘要:最近要使用python,研究下闭包特性。 看下列的代码: def counter(start_at = 0): count = [start_at] def incr(): count[0] += 1 return count[0] return incr if __name__ == '__main__': cou...
阅读全文
posted @
2014-12-27 21:32
inevermore
阅读(204)
推荐(0)
Python学习笔记(七)函数的使用
摘要:python中的函数使用较简单,这里列出值得注意的几点: 内嵌函数 例如: # coding: utf-8 def foo(): def bar(): print 'bar() called.' print 'foo() called.' foo()
bar() 对bar的调用是非法的,因为bar的作用域仅限于foo内,除非使用闭包将...
阅读全文
posted @
2014-11-14 21:56
inevermore
阅读(274)
推荐(0)
Python学习笔记(六)多进程实现并发服务器
摘要:这个相对于多进程更加简单,每accept一个新的连接就创建一个新的线程。代码如下: # coding: utf-8
import socket
import sys
import errno
import threading
from time import ctime class ClientThread(threading.Thread): def __init__(self...
阅读全文
posted @
2014-11-13 23:07
inevermore
阅读(521)
推荐(0)
Python学习笔记(五)多进程实现并发服务器
摘要:每创建一个TCP连接,就创建一个进程。 代码如下: # coding: utf-8
import socket
import os
import sys
import signal
import errno
from time import ctime def hanlde_sigchld(a, b): (pid, status) = os.wait() prin...
阅读全文
posted @
2014-11-13 23:03
inevermore
阅读(582)
推荐(0)