PyCon2013 有意思的幻灯

Interesting slides from PyCon 2013
今年PyCon在加州的Santa Clara召开。我虽然没去,但一如既往的关心。
挑出和我相关的一些有意思的幻灯,在此分享。

1. BeautifulCode
Raymond Hettinger是一个善用Python的高手,他的code非常简洁,有Python的风味。
这个幻灯里,他介绍很多Python中常用的简洁的写法,包括怎么用iterator, list comprehension.
我感觉有意思的是defaultDict (不需要再用dict.get()), decorator(修饰方法,类比CSS)和context(干净的获取和释放资源)

原始链接

2. Python: A “Toy” Language

David Beazley是一个Python作家,对Python GIL有过详细的介绍,以前写过如何把Generator组合成一个workflow的幻灯。
现在在芝加哥教Python。这个人擅长Python的教学,并能给出有趣的例子。这次也不例外,他介绍了如何用Python和Shapeoko (包括Arduino)来组装并使用CNC (数控机床?)。这个例子告诉我们Python可以做计算机程序之外很有用的 应用。

原始链接

3. Awesome Big Data Algorithms

作者是MSU的老师。这个Blog的背景是土壤Genetics。因为土壤中的genetics比单纯人的DNA更复杂,数据量更大,因此需要Big Data Algorithm。这个幻灯介绍三种算法:SkipList, HyperLogLog, Bloom filter(CountMin Sketch)。

SkipList是一种基于链表的数据结构,相对羽平衡二叉树,这个算法的优点是更好的支持并发操作。本质上,SkipList是一个分层次的链表。在最底层,链表元素按顺序排列。在更高的层次,(按照概率)简历一部分低层的数据的索引。这种数据结构在查找时非常有效:从高层开始查找,直到最底层顺序查找,整个查找是log(N)

HyperLogLog是应用于大数据的算法,用来计算一个很大集合的基数(即合理总共有多少不相同的元素)。大致思路是用一组相互独立的哈希函数依次处理输入,然后对哈希值分块计数:对高位统计有多少连续的0;用低位的值当做数据块。比如:011000|01,就是高位有3个连续的0,低位是1,就表示第一个数据块。因为连续观测的三个0的概率大约是1/8,所以对数据块1来讲,可以把计数乘8,作为集合基数的估计。因为低位可能有0,1,2,3这四种数值,总基数可以取上述4中技术的几何平均数。在HyperLogLog中,具体的还有一些系数可以调整,使得估计更准确。
这片Blog详细介绍了HyperLogLog算法,图文并茂。

BloomFilter或CountMin Sketch是两个不同的算法,但又有紧密联系。相似之处是两个算法都需要一族独立的哈希函数。不同之处是处理的问题不同。对BloomFilter,在预处理阶段对每一个特定的输入算出所有哈希函数的值,并在这些值上做出标记。最后,当查找一个特定的输入是否出现过,只需查找这一系列的哈希函数对应值上有没有标记。对于BloomFilter,可能有False Positive,但不可能有False Negative。此外,BloomFilter可看做查找一个数据有或者没有的数据结构(数据的频率是否大于1)。CountMin Sketch在BloomFilter的基础上更进一步,它可用来估算某一个输入的频率(不局限于大于1)。具体思路是对哈希函数值对应的sketch上计数(对BloomFilter则只是标记是或否)。最后估计频率的时候,对每个估算出的频率取最小值。

原始链接

4. Why you should use Python 3 for text processing

这个讲座关注的Python3,而不是现在我使用的Python2.7.3。但在Python社区,有时好的功能会从版本3移植回版本2。
这个讲座介绍了Python3里面的新功能,例如ChainMap,startswith(tuple作为参数),unicode支持,textwrap模块(可以方便的排版)和email模块。

原始链接

用pip安装Matplotlib (Mac)

Install matplotlib using pip (Mac)

在Mac OSX下安装matplotlib并不简单 (比如Linux可以用apt-get,Windows可以直接下载Binary build),因为matplotlib需要一些底层库(例如freetype,pygtk,而pygtk又需要gobject, gobject需要cairo)。

这里总结一下我在Mac OSX下安装Matplotlib的经验。

首先安装MacPorts,具体参见Install MacPorts.

然后安装py27-pygtk

 port install py27-pygtk

然后把pygtk的路径添加到PYTHONPATH里:

export PYTHONPATH=$PYTHONPATH:/opt/local//Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/

最后用pip安装

alias pipInstall='pip install  --install-option="--prefix=/Users/zhanxw/python" '
export CC=/opt/local/bin/g++; export CFLAGS=; export LDFLAGS= ; pipInstall -U matplotlib

这里要指定GCC编译器的路径,否则系统默认用gcc 4.2版编译。
还需要清除CFLAG和LDFLAGS,不然安装的时候不用pkg-config,也就得不到gtk库文件的位置。

额外两个tip:

【1】 安装pip需要先安装setuptools
【2】 一个命令升级所有pip安装的软件:

  pip freeze --local | grep -v '^\-e' | cut -d = -f 1  | xargs pip install -U

此外如何在Mac OSX下用源码安装numpy和scipy?
这里有官网的说明
特别注意的是,编译numpy和scipy要用gcc 4.0版。
另外scipy还需要cython (pip install cython)