BLOG
Enjoy when you can, and endure when you must.
JAN 03, 2014/后端开发与架构
初识Twisted:Reactor、Transports和Protocols
最近在学习Twisted,在此归纳一些重要的概念和理念。 The Reactor Reactor是Twisted的核心,它是一个循环体,也被称为事件循环。Reactor检测各种网络、文件系统和定时事件,等待事件的发生并将其正确分配到对应的事件处理函数。Twisted本身维护了一套跨平台的行为抽象并正确使用底层的无阻塞API接口。Twisted为不同的事件源提供了一个通用的接口,以便在网络协议栈的任何地方对事件作出响应都是一件很容易的事。 Reactor通常说来会完成以下的工作: while True:     ...
JAN 02, 2014/后端开发与架构
初识Twisted:事件驱动编程
最近在学习Twisted,在此归纳一些重要的概念和理念。 事件驱动编程(Event-Driven Programming) Twisted是一个基于事件驱动的网络引擎。 在这种编程模式中,程序流程是由外部事件决定的。它的特性表现在一个事件循环以及采用回调来触发事件的相关动作。将此与其它两种常见模型进行比较应该会更益于理解,他们是单线程(同步)和多线程编程。 我们来看图说话。假如他们都需要处理三个任务,并且在进行I/O操作的时候均会发生阻塞。他们的表现形式将会如下图这样: 从左图可以看出,在单线程处理过程中,每个任务将会按顺序依次执行。当一个任务在处理...
DEC 20, 2013/数据库
Redis整数集合
整数集合(intset)是redis的集合(set)类型的一个encoding方式之一,如果set中值包含整数,并且元素较少的话,redis就会采用intset作为该类型的实现。简单看一下整数集合(intset)的定义:typedef struct intset {     // 保存元素所使用的类型的长度     uint32_t encoding;     // 元素个数   &...
DEC 18, 2013/数据库
Redis压缩列表
压缩列表(ziplist)是由一系列特殊编码的内存块构成的列表,它对于Redis的数据存储优化有着非常重要的作用。 为了更好的理解为什么压缩列表更为高效,我们需要从链表谈起。对于一个典型的双向链表,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。另外还有一个指针指向该节点的字符串。每一个字符串又实际分为三个部分:一个代表该字符串长度的整数,一个代表剩余字节的整数以及以“\0”结尾的字符串本身。以下是一个示例: 忽略其余细节,除字符串本身和空余的字节外,三个指针和两个整数都会占用额外的空间。而压缩列表转为存储上一个结点长度、当前结点长...
DEC 16, 2013/Python
正则表达式语法与re模板的简单应用
正则表达式经常被用于字符串的处理中,特别是一些使用普通处理不方便或较为复杂的环境。在Python标准库中,re模块提供了这方面的功能。不过首先,了解正则表达式的基本语法规则是必要的。其实这并不需要我介绍,因为相关的材料实在太多了,这里推荐给大家一张图片,总结的很详细(以下是一部分,点击可以查看全部)。 那接下来就是运用该语法并结合re模块来完成相应的需求。我想最常用的会是re.match和re.search,这两个方法都是尝试在字符串中匹配一个模式,如下面的示例,我们想匹配出Hello和World两个单词之间有什么内容: >>> tex...
DEC 15, 2013/Python
open函数: 功能简单,学问不少
任何一个有经验的程序员接触一门新语言时,都会首先在该语言的工具箱中寻找文件的相关工具。因为处理外部文件是一种非常实用和常见的任务,该语言的文件处理接口设计的好坏,在很大程度上决定着这门语言工具的实用性。Python对文件的支持,体现在很多层次上:从内建的open函数,到标准库模块提供的一些特定的工具,比如os,再到遍布网络的各种第三方提供的实用工具。本文则主要讨论内建的open函数。在Python中,文件对象是内建类型file的实例。内建函数open会创建并返回一个文件对象。第一个参数是一个字符串,指定文件的路径。而第二个参数也是一个字符串,指定打开文件的模式。例如:>>&g...
DEC 09, 2013/心得与分享
分析性能,优化代码
前几天,我需要实现一个关键字匹配功能,即通过判断一句话中是否含有关键字库中的某个关键字。于是我花了很多功夫去思考应该如何做才能做到简单而高效,后面还越想越复杂。不过,最终我回归到一个最原始的方法,for迭代。最初,我一直觉得for...in不大靠谱,直到我对其做了个简单的测试,拿一个包含20万个关键字的列表运行类似上面的代码并计时,发现其平均耗时在0.02s的样子,并且我笔记本的CPU还不怎么给力。再加上实际中,我这里的keywords会远远少于测试中的20万个。那这样简单的代码在一定程度上其实完全能满足性能的需求。其实我想表达的是有时我们并不用想得过于复杂化,从简单着手,用实践去分析性...
DEC 01, 2013/Python
Python对象拷贝
在Python中,当给一个对象进行赋值、将其作为参数传递或作为结果返回时,总是使用的是一个指向原对象的引用,而不是拷贝。 由此可见,如果确实需要拷贝则需要明确使用“拷贝”的方法来解决。 不过还要注意的是,对象拷贝始终针对的是可变数据类型,对于像字符串、数字、元组等不可变对象是没有必要拷贝的。 Python标准库中的copy模块提供了对象拷贝的方法: copy.copy()返回一个具有相同的内容和属性的对象,该方法属于浅拷贝,它生成一个新对象,但是对象内部的属性和内容仍引用原对象。 >>> imp...
NOV 27, 2013/Python
Python版二叉查找树
二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。 二叉查找树的特点则在于对于树中的每个节点X,它的左子树中所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项。这意味着该树所有的元素都可以用某种一致的方式排序。如下图所示是一个二叉查找树: 为实现一个二叉查找树,我们将创建三个类: BinaryTree:代表一个二叉树,实现初始化和操作; EmptyNode:代表空节点; BinaryNode:代表非空节点,具...
NOV 26, 2013/Python
解析XML:更优的性能
BeautifulSoup是一个很强大的HTML/XML解析工具,简单易用。不过从性能上来说,它可能并不是最好的。因此,我们考虑使用另外一个第三方包lxml,它在底层是通过C实现的,因此在速度上会有明显的优势。还是之前的例子:<?xml version="1.0" encoding="utf-8"?> <CSubmitState xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www...
<< < 4 5 6 7 8 > >>