- 博客(15)
- 收藏
- 关注
原创 社区帖子anti-spam综述
搞了anti-spam之后,发现原来杀毒软件的原理也是类似的,浏览器的AdBlock插件原理也是类似的.目的垃圾是不可能根绝的,就跟犯罪不可能根绝一样.所以anti-spam的目的,就是提高攻击成本,降低防御成本.攻击者的目的无非就是牟利,当他们成本太高的时候,就会降低攻击力度.攻击者的智慧人肉打码:绕过验证码淘宝"注册账号交易"代收短信业务/代收邮件业务:
2014-11-27 00:07:29 3689 2
原创 飘逸的python - 使用dis模块进行代码层次的性能剖析
dis — Disassembler for Python bytecode,即把python代码反汇编为字节码指令.使用超级简单:python -m dis xxx.py当我在网上看到while 1比while True快的时候,我感到很困惑,为何会有这种区别呢?于是使用dis来深入.假设est_while.py代码如下.#coding=utf-8while 1
2014-11-25 12:22:41 8529 2
原创 飘逸的python - 实现trie树
trie,又称前缀树或字典树. 它利用字符串的公共前缀来节约存储空间.定义Trie树中每个单词都是通过character by character方法进行存储,相同前缀单词共享前缀节点.可以看到,每条路径组成一个单词.上面这颗树存了to/tea/ted/ten/inn这些词.性质(1)根节点不包含字符,除根节点外的每个节点只包含一个字符。(2)从根节点到
2014-11-24 15:56:21 16239 1
原创 飘逸的python - 作用域与lookup策略
首先了解什么是命名空间,命名空间是一个”命名->对象“的映射,在python中用dict实现的。而作用域,是指能直接访问到的命名空间。当我们访问一个变量时,会按LEGB的顺序来lookup:L->Local. 即局部变量,比如定义在def或lambda中的变量。E-> Enclosing function locals. 即闭包中的变量。G->Global (modul
2014-11-23 00:55:09 5836
原创 飘逸的python - 为什么修改全局的dict变量不用global关键字
比如下面这段代码s = 'foo'd = {'a':1}def f(): s = 'bar' d['b'] = 2f()print sprint d为什么修改字典d的值不用global关键字先声明呢?这是因为,在s = 'bar'这句中,它是“有歧义的“,因为它既可以是表示引用全局变量s,也可以是创建一个新的局部变量,所以在python中
2014-11-23 00:10:45 8545 1
原创 飘逸的python - 大数据TopK问题的quick select解法
TopK问题,即寻找最大的K个数,这个问题非常常见,比如从1千万搜索记录中找出最热门的10个关键词.方法一:先排序,然后截取前k个数.时间复杂度:O(n*logn)+O(k)=O(n*logn)。方法二:最小堆.维护容量为k的最小堆.根据最小堆性质,堆顶一定是最小的,如果小于堆顶,则直接pass,如果大于堆顶,则替换掉堆顶,并heapify整理堆,其中heapify
2014-11-21 18:17:08 9657 8
原创 飘逸的python - and_or大法
George Boole神奇的将逻辑变成了代数,使之可以演算,因此,被叫做布尔代数.而and和or是布尔代数其中的2个符号.首先,我们要明确一个东西,Python和很多语言一样,都是返回两个被操作对象中的一个,而非它们的布尔表达式 True 或 False.比如>>False and 2False>>True and 22>>1 and 11其次,了解什么是短路
2014-11-20 17:05:18 2451
原创 飘逸的python - 八皇后问题简洁解法
思路:使用DFS.用一维数组表达坐标,其中下标为行,元素为列.A[i]=j表示将第i行的皇后放在j列上.一行一行依次遍历(从上往下),决定放在哪列(从左往右),这样就不用判断行冲突,只需要判断列冲突和主斜线副斜线冲突.(行-列)标识主斜线, (行+列)标识副斜线.下面上代码.#coding=utf-8#风格1def queen(A, cur=0): if
2014-11-20 10:34:24 10184 3
原创 当python邂逅vim
先上效果图:前言:在这个年纪爱上vim,不是因为它漂亮,只是那天阳光很好,我用它敲坏了键盘. ------一位不愿意透露姓名的人士第一次接触vim,是在上linux操作系统的课上,当时的想法是,"这东西怎么这么难用,要输入个东西都不知道怎么输入".但是,经过几天的了解和练习之后.我深深的被震撼了.先进的理念/多种模式/全键盘操作/快速定位/风骚的快捷键和命令/丰富的插件
2014-11-18 18:11:29 4271
原创 什么是string interning(字符串驻留)以及python中字符串的intern机制
In computer science, string interning is a method of storing only one copy of each distinct string value, which must be immutable. Interning strings makes some string processing tasks more tim
2014-11-16 11:34:23 6200 2
原创 试试pypy
pypy是一个python的解释器和JIT编译器。可以在不修改任何代码的情况下大幅提升python代码的性能。使用超级简单,在官网下载编译好的二进制包进行安装,然后然后运行代码的时候指定这个解释器就行了。我们来试试下面这段代码。import timet1 = time.time()i = 10000000while i: i -= 1print time.time()
2014-11-16 09:46:56 3299
原创 飘逸的python - 字符串的KMP匹配算法
首先我们来看一下字符串的朴素匹配.可以想象成把文本串s固定住,模式串p从s最左边开始对齐,如果对齐的部分完全一样,则匹配成功,失败则将模式串p整体往右移1位,继续检查对齐部分,如此反复.#朴素匹配def naive_match(s, p): m = len(s); n = len(p) for i in range(m-n+1):#起始指针i if s[i
2014-11-10 11:20:27 11090 8
原创 飘逸的python - yield简明教程
发现还有很多人对yield不理解,云里雾里,于是试着用文字表述.只要函数含有yield语句,它就返回一个生成器.所以我们与其把其看成函数定义,不如看作是生成器定义.函数用return返回,而生成器用yield返回.接下来是yield的行为.比如def html(): yield 'header' for i in range(5): yield
2014-11-07 10:56:34 4661
原创 飘逸的python - 不使用关键字,求和1+2+…+n
根据题意,我们不能用到if/else/for/while等关键字.--------------思考中------------思路:1.用递归实现循环2.递归的终止条件不用if怎么判断呢? 答案是字典,其中用not not n来把数字n转成bool.上代码:def sum_(n): return n + { True:
2014-11-03 15:38:44 4741
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人