使用C/C++扩展Python之一

在 Thu 12 November 2015 发布于 Python 分类 • 标签为 Python, C/C++, Python扩展

假设我们需要使用C/C++实现一个翻转字符串的扩展功能, 下面是C语言的实现

#include <stdio.h>
#include <stdlib.h>

char* reverse(char *s)
{
    if (NULL == s) {
        return NULL;
    }
    int low = 0;
    int higth = strlen(s) - 1;
    while (low < hight) {
        char tmp = s[low];
        s[low] = s[hight]
        s[hight] = tmp;
        ++low;
        --hight;
    }
    return s;
}

首先,我们需要解决的问题是,怎样在Python环境下传递参数,即在Python …


阅读全文

Scrapy框架组件之调度器

在 Fri 06 November 2015 发布于 源码分析 分类 • 标签为 scrapy

本片文章分析的是Scrapy框架的调度器的实现。在Scrapy框架中,调度器的作用是调度Request对象,弹出Request对象提交给Scrapy引擎进行fetch,压入新的需要fetch的Request对象,涉及到Request的存储调度。

在进行下面之前,需要了解一个Python的开源库queuelib, 它现在从Scrapy框架中独立出去,作为一个单独的库开源出去,其实现了一系列的队列。 下面简单的说下:

FifoDiskQueue: 这是个FIFO队列,使用文件块来实现落地磁盘的功能。每个文件块存储的数据的个数为chunksize的大小,这个值默认的情况下是100000条,且在落地的文件夹里面会有个info.json文件,其内容格式为

 {"tail": [0, 0, 0], "head": [10, 0], "chunksize": 100000, "size": 1000000}

size为当前FifoDiskQueue的大小;chunksize为每个文件块能够存储多少条数据;head的第一个元素为要写入数据的文件块的下标,第二个元素为该文件块已经写了多少条数据;tail的第一个元素为要读的文件块的下标,第二个元素为累计读取了多少条数据,第三个元素文件的offset记录读取了多少字节。需要注意的是在每次操作完了FifoDiskQueue实例后,都需要调用其成员函数close,以写入状态到info.json …


阅读全文

scrapy排重机制

在 Wed 16 September 2015 发布于 源码分析 分类 • 标签为 scrapy, Python, 爬虫

本篇文章主要的内容是scrapy在单机排重下的机制, 并提共分布式scrapy爬虫服务的url排重方案

scrapy在单机下设置url是否排重过滤很简单, 在每次抛出对该url构造的Request对象给调度器(schedler)时候, 设置Request的参数dont_filter 是否为True来让schedler判断时候对其走排重过滤的逻辑, dont_filter的默认值为False, 即该url会走排重逻辑 源码逻辑如下:

    def enqueue_request(self, request):
        if not request.dont_filter and self.df.request_seen(request):
            self.df.log(request, self.spider)
            return False
        dqok = self._dqpush(request)
        if dqok:
            self.stats.inc_value('scheduler/enqueued/disk', spider=self.spider)
        else …

阅读全文

Hive 总结

在 Thu 27 August 2015 发布于 大数据 分类 • 标签为 Hive

安装

1.因为要把元数据存入mysql,需要下载mysql的jar包并移动到hive的lib目录下

2.进入conf文件夹把hive-default.xml.template 拷贝一份,重命名为hive-site.xml

3.修改hive-site.xml配置文件中的几个重要的参数

4.hive.metastore.warehouse.dir 这个hive的数据仓库的存储位置,其值一般都是HDFS中的路径,如:/user/hive/warehouse

5.javax.jdo.option.ConnectionURL,这个参数需要填写的时JDBC连接字符串,如:jdbc:mysql://localhost:3306/hive?characterEncoding=UTF-8

6.javax.jdo.option.ConnectionDriverName,设置JDBC的Driver,如:com.mysql.jdbc.Driver …


阅读全文

Native Bayes Classifier

在 Sat 22 August 2015 发布于 ML 分类

1.概率

某个试验的样本空间为\(S\)。对应于其中任一事件\(E\)。记\(P(E)\),它满足如下3个公理

公理1: \(0 <= P(E) <= 1\)

公理2: \(P(S) = 1\)

公理3: 对任一列互不相容的事件\(E_1,E_2\), ...(即如果\(i \neq j\)\(E_IE_J\neq\phi\)),有

$$P(\bigcup_{i=1}^{n}E_i) = P(\sum_{i=1}^nE_i)$$

就称\(P(E)\)为事件\(E\)的概率

2 …

阅读全文

STL -- Insert Iterator 简单分析

在 Mon 20 July 2015 发布于 STL 分类 • 标签为 C/C++, STL, 源码分析

【以下代码都来自 SGI STL -- stl_iterator.h】

工作中STL用的很多, 多次用到insert iterator系列函数,但是一直都没有注意过为什么要这么用。只是知道inserter是'插入',front_inserter是'头插',back_inserter是'尾插'。当然这些叫法只是为我自己记住怎么使用这系列的函数。本着知其然知其所以然,本篇文章将简单的分析下Insert Iterator的实现细节。 现看inserter的这个函数的实现吧:

template <class _Container, class _Iterator>
inline
insert_iterator<_Container> inserter(_Container& __x, _Iterator __i)
{
    typedef typename _Container::iterator __iter;
    return insert_iterator<_Container>(__x, __iter …

阅读全文

从Python的闭包到装饰器

在 Sun 05 July 2015 发布于 Python 分类 • 标签为 Python, 闭包, 装饰器

函数里面定义函数叫做嵌套函数, 如:

def Print(msg):
  def doPrint():
    print msg
  doPrint()

print dir(Print)
#['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']
print Print.__closure__
# None
Print('Hello …

阅读全文

[译]了解Python的with语句

在 Sun 08 March 2015 发布于 Python 分类 • 标签为 Python

这篇文章虽然有些时日, 但是觉得这篇博文通俗易懂, 翻译起来也没有太大的压力, 然后就有了篇译文. 初次翻译, 如有错误, 请告知, 谢谢!

从comp.lang.python和其他论坛来看, 有经验的python开发者对python2.5新的with语句(坏链接)似乎依旧有些困惑.

就像python中的其他大部分的特性, 只要你弄懂了with 语句想要解决的问题, 你就会知道with语句其实是很简单的. 看看下面这段代码:

set things up
try:
    do something
finally:
    tear things down

‘初始设置’ 可能是打开一个文件, 或者是获取一些额外的资源, ‘清理阶段’可能是关闭一个文件, 释放或者归还资源. try-finally结构保证 '清理阶段'部分是一定被执行,尽管 主要逻辑部分的代码并没有把要做的工作做完

当有大量这种重复性的工作时, 把'初始设置' 和 '清理阶段'封装成库是很便利, 也易于复用. 你可能会做如下封装:

def controlled_execution …

阅读全文

Shell 字符串处理

在 Wed 18 June 2014 发布于 Shell 分类 • 标签为 Shell, string

字符串的长度

stringZ=abcABc123ABCabc
echo ${#stringZ}
echo `expr length $stringZ`
echo `expr "$stringZ" : '.*'`

从字符串的起始位置开始进行匹配, 返回匹配子串的长度

stringZ=abcABC123ABCabc

echo `expr match "$stringZ" 'abc[A-Z]*.2'`  #8
echo `expr "$stringZ" : 'abc[A-Z]*.2'` #8

从目标串中找出第一次出现模式串中的字符位置, 并返回其下标(下标从1开始)

stringZ=abcABC123ABCabc
echo `expr index "$stringZ" C12` #6

echo `expr index "$stringZ" 1c` #3

${string:position …


阅读全文

Shell I/O重定向

在 Sun 02 March 2014 发布于 Shell 分类

简单的说linux下I/O重定向就是把文件、命令、可执行程序、脚本等的输出作为另一个文件、命令、可执行程序、脚本做其输入数据.

每个打开的文件都分配了一个唯一的文件描述符,这个文件描述是一个整数,依次递增, 类似C语言中的open函数。 代表标准输入(stdin), 标准输出(stdout), 标准错误输出(stderr)的文件描述符分别是0、1、2。

通过>>>来进行输出重定向,对于输出重定向到文件, 需要注意的是 >会截断文件使其长度为0, 也就是说是空文件, 如果文件不存在的话,就会创建一个文件。命令> README.md:> README.md,及 touch README.md的作用一样都是创建一个空文件README.md,其中第二个命令中的:只是一个占位符 …


阅读全文