部署uWSGI/实现方式/多进程请求的性能比较

在V2EX看到一个问题帖子<怎样判断字符串是否是双拼?>

test

有人提到单拼是有限多的,所以完全可以构造出双拼,刚看到帖子,我的想法是将用户输入的数据进行拆分。最后,也有人直接用正则表达式实现。我觉得,电脑进行简单的运算所需要的时间已经微乎其微了,但是楼主说考虑性能因素,我比较好奇会有多大的差异,所以打算测试几种情况,一是采用如下的分割测试,re正则匹配,redis的set,和使用hiredis解析器的redis进行测试,本来打算用Node去做会更顺手些,不过还是选择django来做简单的框架,顺便测试一下runserver方式和uwsgi的部署方式的性能差异

因电脑测试时,多进程请求与uwsgi会争抢CPU资源,导致处理时间会达到一个阀值,下面会说明

简单结论:

  • 面对即使简单的计算“拆分匹配”,当请求数量很多时,会表现性能不佳,多进程的情况下,更能贴近实际访问需求,虽然使用uwsgi部署提高了处理能力,但是依旧性能最差
  • 正则表达式方式相比于拆分匹配计算机应该少了很多的计算量,并且实现简单,性能比较出色,在解决针对性的如帖子中的问题时应该是最好的解决方案,无论从性能和部署角度都可以让人满意
  • Redis我不会调优,就是简单的把双拼的组合存入了set中,然后sismember判断是否在数据库中,速度略次于正则,这很有可能是因为调取数据库操作花费了很多的时间,如果“单拼”的数量再大十倍,想必Redis的优势就马上体现出来了
  • Redis使用Hiredis解析器的时候可见性单次查询速度提升很大,在使用Redis的时候非常有必要使用hiredis进行解析,在使用多进程请求,按照上边的例子,应该都是时间缩短许多的,但是却很单进程想差无几,这个原因应该是我的CPU达到瓶颈,多进程占用过多的CPU,导致uwsgi无法更多的使用CPU所导致,如果将部署的电脑和请求程序分开,一定会有不一样的结果
  • 测试中,内存并未有过多占用情况
  • 整体来讲,解决简单的问题,用最好是采用简单高效的方法,如本例中的正则,当数据量大到一定程度,那么借助缓存数据库是个不错的主意,另外,即使是再简单的计算,当请求量一变大,那么也足以影响性能

如下的这个就是我想的拆分测试,计算量也不是蛮大的

比如输入这个“ yolai ”
做一个函数,将其分割为如下形式

# "y" "olai"
# "yo" "lai"
# "yol" "ai"
# "yola" "i"

然后再写一个函数判断他们是否在单拼列表中,如果存在一对都在单拼列表,则返回 true

Django的基础Hello world就不介绍了,为了方便,代码都写在view中了,如下是三种方法的python代码

拆分匹配

写的不是很满意,如果lambda和各种内置方法用的熟练相信会减少很多的步骤...

from django.http import HttpResponse

dan = ["a", "ai", "an", "ang", "ao", "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi", "bian", "biao", "bie", "bin", "bing", "bo", "bu", "ca", "cai", "can", "cang", "cao", "ce", "cen", "ceng", "cha", "chai", "chan", "chang", "chao", "che", "chen", "cheng", "chi", "chong", "chou", "chu", "chua", "chuai", "chuan", "chuang", "chui", "chun", "chuo", "ci", "cong", "cou", "cu", "cuan", "cui", "cun", "cuo", "da", "dai", "dan", "dang", "dao", "de", "den", "dei", "deng", "di", "dia", "dian", "diao", "die", "ding", "diu", "dong", "dou", "du", "duan", "dui", "dun", "duo", "e", "ei", "en", "eng", "er", "fa", "fan", "fang", "fei", "fen", "feng", "fo", "fou", "fu", "ga", "gai", "gan", "gang", "gao", "ge", "gei", "gen", "geng", "gong", "gou", "gu", "gua", "guai", "guan", "guang", "gui", "gun", "guo", "ha", "hai", "han", "hang", "hao", "he", "hei", "hen", "heng", "hong", "hou", "hu", "hua", "huai", "huan", "huang", "hui", "hun", "huo", "ji", "jia", "jian", "jiang", "jiao", "jie", "jin", "jing", "jiong", "jiu", "ju", "juan", "jue", "jun", "ka", "kai", "kan", "kang", "kao", "ke", "ken", "keng", "kong", "kou", "ku", "kua", "kuai", "kuan", "kuang", "kui", "kun", "kuo", "la", "lai", "lan", "lang", "lao", "le", "lei", "leng", "li", "lia", "lian", "liang", "liao", "lie", "lin", "ling", "liu", "long", "lou", "lu", "luan", "lue", "lun", "luo", "ma", "mai", "man", "mang", "mao", "me", "mei", "men", "meng", "mi", "mian", "miao", "mie", "min", "ming", "miu", "mo", "mou", "mu", "na", "nai", "nan", "nang", "nao", "ne", "nei", "nen", "neng", "ni", "nian", "niang", "niao", "nie", "nin", "ning", "niu", "nong", "nou", "nu", "nuan", "nuo", "nun", "o", "ou", "pa", "pai", "pan", "pang", "pao", "pei", "pen", "peng", "pi", "pian", "piao", "pie", "pin", "ping", "po", "pou", "pu", "qi", "qia", "qian", "qiang", "qiao", "qie", "qin", "qing", "qiong", "qiu", "qu", "quan", "que", "qun", "ran", "rang", "rao", "re", "ren", "reng", "ri", "rong", "rou", "ru", "ruan", "rui", "run", "ruo", "sa", "sai", "san", "sang", "sao", "se", "sen", "seng", "sha", "shai", "shan", "shang", "shao", "she", "shei", "shen", "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang", "shui", "shun", "shuo", "si", "song", "sou", "su", "suan", "sui", "sun", "suo", "ta", "tai", "tan", "tang", "tao", "te", "teng", "ti", "tian", "tiao", "tie", "ting", "tong", "tou", "tu", "tuan", "tui", "tun", "tuo", "wa", "wai", "wan", "wang", "wei", "wen", "weng", "wo", "wu", "xi", "xia", "xian", "xiang", "xiao", "xie", "xin", "xing", "xiong", "xiu", "xu", "xuan", "xue", "xun", "ya", "yan", "yang", "yao", "ye", "yi", "yin", "ying", "yo", "yong", "you", "yu", "yuan", "yue", "yun", "za", "zai", "zan", "zang", "zao", "ze", "zei", "zen", "zeng", "zha", "zhai", "zhan", "zhang", "zhao", "zhe", "zhei", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu", "zhua", "zhuai", "zhuan", "zhuang", "zhui", "zhun", "zhuo", "zi", "zong", "zou", "zu", "zuan", "zui", "zun", "zuo"]

print len(dan)

#text = "yolai"

def mySplit(text):

    length = len(text)
    lt = []
    for i in range(1, length):
        lt.append(text[0:i]);
        lt.append(text[i:length]);

    return lt

def panduan(lt):

    def ifIndan(s):
        return 1 if s in dan else 0

    rt = map(ifIndan, lt)
    print rt    # [0, 0, 1, 1, 0, 1, 0, 0]

    for i in range(0, len(rt)-1, 2):
        print i, rt[i], rt[i+1]
        if rt[i] + rt[i+1] == 2:
            return True

    return False

def check(request, text):

    lt = mySplit(text)
    result = panduan(lt)

    print result

    return HttpResponse(result)

正则匹配

真是简单粗暴,为什么我最开始没想到正则呢?

def check(request, text):

    m = re.match(r"^((?:a)|(?:ai)|(?:an)|(?:ang)|(?:ao)|(?:ba)|(?:bai)|(?:ban)|(?:bang)|(?:bao)|(?:bei)|(?:ben)|(?:beng)|(?:bi)|(?:bian)|(?:biao)|(?:bie)|(?:bin)|(?:bing)|(?:bo)|(?:bu)|(?:ca)|(?:cai)|(?:can)|(?:cang)|(?:cao)|(?:ce)|(?:cen)|(?:ceng)|(?:cha)|(?:chai)|(?:chan)|(?:chang)|(?:chao)|(?:che)|(?:chen)|(?:cheng)|(?:chi)|(?:chong)|(?:chou)|(?:chu)|(?:chua)|(?:chuai)|(?:chuan)|(?:chuang)|(?:chui)|(?:chun)|(?:chuo)|(?:ci)|(?:cong)|(?:cou)|(?:cu)|(?:cuan)|(?:cui)|(?:cun)|(?:cuo)|(?:da)|(?:dai)|(?:dan)|(?:dang)|(?:dao)|(?:de)|(?:den)|(?:dei)|(?:deng)|(?:di)|(?:dia)|(?:dian)|(?:diao)|(?:die)|(?:ding)|(?:diu)|(?:dong)|(?:dou)|(?:du)|(?:duan)|(?:dui)|(?:dun)|(?:duo)|(?:e)|(?:ei)|(?:en)|(?:eng)|(?:er)|(?:fa)|(?:fan)|(?:fang)|(?:fei)|(?:fen)|(?:feng)|(?:fo)|(?:fou)|(?:fu)|(?:ga)|(?:gai)|(?:gan)|(?:gang)|(?:gao)|(?:ge)|(?:gei)|(?:gen)|(?:geng)|(?:gong)|(?:gou)|(?:gu)|(?:gua)|(?:guai)|(?:guan)|(?:guang)|(?:gui)|(?:gun)|(?:guo)|(?:ha)|(?:hai)|(?:han)|(?:hang)|(?:hao)|(?:he)|(?:hei)|(?:hen)|(?:heng)|(?:hong)|(?:hou)|(?:hu)|(?:hua)|(?:huai)|(?:huan)|(?:huang)|(?:hui)|(?:hun)|(?:huo)|(?:ji)|(?:jia)|(?:jian)|(?:jiang)|(?:jiao)|(?:jie)|(?:jin)|(?:jing)|(?:jiong)|(?:jiu)|(?:ju)|(?:juan)|(?:jue)|(?:jun)|(?:ka)|(?:kai)|(?:kan)|(?:kang)|(?:kao)|(?:ke)|(?:ken)|(?:keng)|(?:kong)|(?:kou)|(?:ku)|(?:kua)|(?:kuai)|(?:kuan)|(?:kuang)|(?:kui)|(?:kun)|(?:kuo)|(?:la)|(?:lai)|(?:lan)|(?:lang)|(?:lao)|(?:le)|(?:lei)|(?:leng)|(?:li)|(?:lia)|(?:lian)|(?:liang)|(?:liao)|(?:lie)|(?:lin)|(?:ling)|(?:liu)|(?:long)|(?:lou)|(?:lu)|(?:luan)|(?:lue)|(?:lun)|(?:luo)|(?:ma)|(?:mai)|(?:man)|(?:mang)|(?:mao)|(?:me)|(?:mei)|(?:men)|(?:meng)|(?:mi)|(?:mian)|(?:miao)|(?:mie)|(?:min)|(?:ming)|(?:miu)|(?:mo)|(?:mou)|(?:mu)|(?:na)|(?:nai)|(?:nan)|(?:nang)|(?:nao)|(?:ne)|(?:nei)|(?:nen)|(?:neng)|(?:ni)|(?:nian)|(?:niang)|(?:niao)|(?:nie)|(?:nin)|(?:ning)|(?:niu)|(?:nong)|(?:nou)|(?:nu)|(?:nuan)|(?:nuo)|(?:nun)|(?:o)|(?:ou)|(?:pa)|(?:pai)|(?:pan)|(?:pang)|(?:pao)|(?:pei)|(?:pen)|(?:peng)|(?:pi)|(?:pian)|(?:piao)|(?:pie)|(?:pin)|(?:ping)|(?:po)|(?:pou)|(?:pu)|(?:qi)|(?:qia)|(?:qian)|(?:qiang)|(?:qiao)|(?:qie)|(?:qin)|(?:qing)|(?:qiong)|(?:qiu)|(?:qu)|(?:quan)|(?:que)|(?:qun)|(?:ran)|(?:rang)|(?:rao)|(?:re)|(?:ren)|(?:reng)|(?:ri)|(?:rong)|(?:rou)|(?:ru)|(?:ruan)|(?:rui)|(?:run)|(?:ruo)|(?:sa)|(?:sai)|(?:san)|(?:sang)|(?:sao)|(?:se)|(?:sen)|(?:seng)|(?:sha)|(?:shai)|(?:shan)|(?:shang)|(?:shao)|(?:she)|(?:shei)|(?:shen)|(?:sheng)|(?:shi)|(?:shou)|(?:shu)|(?:shua)|(?:shuai)|(?:shuan)|(?:shuang)|(?:shui)|(?:shun)|(?:shuo)|(?:si)|(?:song)|(?:sou)|(?:su)|(?:suan)|(?:sui)|(?:sun)|(?:suo)|(?:ta)|(?:tai)|(?:tan)|(?:tang)|(?:tao)|(?:te)|(?:teng)|(?:ti)|(?:tian)|(?:tiao)|(?:tie)|(?:ting)|(?:tong)|(?:tou)|(?:tu)|(?:tuan)|(?:tui)|(?:tun)|(?:tuo)|(?:wa)|(?:wai)|(?:wan)|(?:wang)|(?:wei)|(?:wen)|(?:weng)|(?:wo)|(?:wu)|(?:xi)|(?:xia)|(?:xian)|(?:xiang)|(?:xiao)|(?:xie)|(?:xin)|(?:xing)|(?:xiong)|(?:xiu)|(?:xu)|(?:xuan)|(?:xue)|(?:xun)|(?:ya)|(?:yan)|(?:yang)|(?:yao)|(?:ye)|(?:yi)|(?:yin)|(?:ying)|(?:yo)|(?:yong)|(?:you)|(?:yu)|(?:yuan)|(?:yue)|(?:yun)|(?:za)|(?:zai)|(?:zan)|(?:zang)|(?:zao)|(?:ze)|(?:zei)|(?:zen)|(?:zeng)|(?:zha)|(?:zhai)|(?:zhan)|(?:zhang)|(?:zhao)|(?:zhe)|(?:zhei)|(?:zhen)|(?:zheng)|(?:zhi)|(?:zhong)|(?:zhou)|(?:zhu)|(?:zhua)|(?:zhuai)|(?:zhuan)|(?:zhuang)|(?:zhui)|(?:zhun)|(?:zhuo)|(?:zi)|(?:zong)|(?:zou)|(?:zu)|(?:zuan)|(?:zui)|(?:zun)|(?:zuo)){2}$", text)


    if m:
        return HttpResponse(True)
    else:
        return HttpResponse(False)

Redis

from django.http import HttpResponse
from django.conf import settings
import redis

def check(request, text):

    pool = settings.POOL
    r = redis.Redis(connection_pool=pool)
    value = r.sismember("shuangpin", text)

    print text
    print value

    return HttpResponse(value)

在settings.py中添加如下代码

import redis

POOL = redis.ConnectionPool(host='localhost', port=6379, db=0)

另外,redis使用hiredis很简单,直接安装即可

$ pip install hiredis

还有就是关于django的部署一点点记录

可以参考这两篇文章

另外,我这里测试因为是本机,所以没有部署Nginx,所以直接配置好uwsgi就可以了,相对于提供给Nginx的socket,我在测试时将socket改为了http以供网页端访问

<uwsgi>
    <http>:8078</http>
    <chdir>/home/sincerefly/Works/PyProjects/helloDjango/helloworld2</chdir>
    <module>helloworld.wsgi</module>
    <processes>4</processes> <!-- 进程数 -->
    <daemonize>uwsgi.log</daemonize>
</uwsgi>

从django1.5开始,项目已经自动生成wsgi.py了,所以不需要自己创建,使用方法如上配置,将其命名为django_http.xml保存在manage.py同级目录即可

命令:uwsgi -x django_http.xml,启动完成后可以使用如下命令查看是否在监听端口

netstat -tunlp | grep uwsgi

查看实时日志可以这样看

tail -F uwsgi.log

最后是一些辅助脚本

genStr.py 生成测试数据,双拼与非双拼比例2:8

#!/bin/env python
#encoding:utf-8
import random

dan = ["a", "ai", "an", "ang", "ao", "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi", "bian", "biao", "bie", "bin", "bing", "bo", "bu", "ca", "cai", "can", "cang", "cao", "ce", "cen", "ceng", "cha", "chai", "chan", "chang", "chao", "che", "chen", "cheng", "chi", "chong", "chou", "chu", "chua", "chuai", "chuan", "chuang", "chui", "chun", "chuo", "ci", "cong", "cou", "cu", "cuan", "cui", "cun", "cuo", "da", "dai", "dan", "dang", "dao", "de", "den", "dei", "deng", "di", "dia", "dian", "diao", "die", "ding", "diu", "dong", "dou", "du", "duan", "dui", "dun", "duo", "e", "ei", "en", "eng", "er", "fa", "fan", "fang", "fei", "fen", "feng", "fo", "fou", "fu", "ga", "gai", "gan", "gang", "gao", "ge", "gei", "gen", "geng", "gong", "gou", "gu", "gua", "guai", "guan", "guang", "gui", "gun", "guo", "ha", "hai", "han", "hang", "hao", "he", "hei", "hen", "heng", "hong", "hou", "hu", "hua", "huai", "huan", "huang", "hui", "hun", "huo", "ji", "jia", "jian", "jiang", "jiao", "jie", "jin", "jing", "jiong", "jiu", "ju", "juan", "jue", "jun", "ka", "kai", "kan", "kang", "kao", "ke", "ken", "keng", "kong", "kou", "ku", "kua", "kuai", "kuan", "kuang", "kui", "kun", "kuo", "la", "lai", "lan", "lang", "lao", "le", "lei", "leng", "li", "lia", "lian", "liang", "liao", "lie", "lin", "ling", "liu", "long", "lou", "lu", "luan", "lue", "lun", "luo", "ma", "mai", "man", "mang", "mao", "me", "mei", "men", "meng", "mi", "mian", "miao", "mie", "min", "ming", "miu", "mo", "mou", "mu", "na", "nai", "nan", "nang", "nao", "ne", "nei", "nen", "neng", "ni", "nian", "niang", "niao", "nie", "nin", "ning", "niu", "nong", "nou", "nu", "nuan", "nuo", "nun", "o", "ou", "pa", "pai", "pan", "pang", "pao", "pei", "pen", "peng", "pi", "pian", "piao", "pie", "pin", "ping", "po", "pou", "pu", "qi", "qia", "qian", "qiang", "qiao", "qie", "qin", "qing", "qiong", "qiu", "qu", "quan", "que", "qun", "ran", "rang", "rao", "re", "ren", "reng", "ri", "rong", "rou", "ru", "ruan", "rui", "run", "ruo", "sa", "sai", "san", "sang", "sao", "se", "sen", "seng", "sha", "shai", "shan", "shang", "shao", "she", "shei", "shen", "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang", "shui", "shun", "shuo", "si", "song", "sou", "su", "suan", "sui", "sun", "suo", "ta", "tai", "tan", "tang", "tao", "te", "teng", "ti", "tian", "tiao", "tie", "ting", "tong", "tou", "tu", "tuan", "tui", "tun", "tuo", "wa", "wai", "wan", "wang", "wei", "wen", "weng", "wo", "wu", "xi", "xia", "xian", "xiang", "xiao", "xie", "xin", "xing", "xiong", "xiu", "xu", "xuan", "xue", "xun", "ya", "yan", "yang", "yao", "ye", "yi", "yin", "ying", "yo", "yong", "you", "yu", "yuan", "yue", "yun", "za", "zai", "zan", "zang", "zao", "ze", "zei", "zen", "zeng", "zha", "zhai", "zhan", "zhang", "zhao", "zhe", "zhei", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu", "zhua", "zhuai", "zhuan", "zhuang", "zhui", "zhun", "zhuo", "zi", "zong", "zou", "zu", "zuan", "zui", "zun", "zuo"]
abc = ["a", "bb", "ccc", "dddd", "eeeee"]

def genStr():
    string = ''
    for i in range(0, 100000):
        if random.randint(0, 10) > 8:
            s1 = dan[random.randint(0, 400)]
            s2 = dan[random.randint(0, 400)]
            truedata = s1 + s2
            string = string + truedata + '\n'
            print truedata
        else:
            s1 = abc[random.randint(0, 4)]
            s2 = abc[random.randint(0, 4)]
            useless = "py" + s1 + s2
            string = string + useless + '\n'
            print useless
    return string

string = genStr()
f = file("data.txt", "w+")
f.write(string)
f.close()

initRedis.py 将双拼插入到Redis的集合中

#!/bin/env python
#encoding:utf-8
import redis

dan = ["a", "ai", "an", "ang", "ao", "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi", "bian", "biao", "bie", "bin", "bing", "bo", "bu", "ca", "cai", "can", "cang", "cao", "ce", "cen", "ceng", "cha", "chai", "chan", "chang", "chao", "che", "chen", "cheng", "chi", "chong", "chou", "chu", "chua", "chuai", "chuan", "chuang", "chui", "chun", "chuo", "ci", "cong", "cou", "cu", "cuan", "cui", "cun", "cuo", "da", "dai", "dan", "dang", "dao", "de", "den", "dei", "deng", "di", "dia", "dian", "diao", "die", "ding", "diu", "dong", "dou", "du", "duan", "dui", "dun", "duo", "e", "ei", "en", "eng", "er", "fa", "fan", "fang", "fei", "fen", "feng", "fo", "fou", "fu", "ga", "gai", "gan", "gang", "gao", "ge", "gei", "gen", "geng", "gong", "gou", "gu", "gua", "guai", "guan", "guang", "gui", "gun", "guo", "ha", "hai", "han", "hang", "hao", "he", "hei", "hen", "heng", "hong", "hou", "hu", "hua", "huai", "huan", "huang", "hui", "hun", "huo", "ji", "jia", "jian", "jiang", "jiao", "jie", "jin", "jing", "jiong", "jiu", "ju", "juan", "jue", "jun", "ka", "kai", "kan", "kang", "kao", "ke", "ken", "keng", "kong", "kou", "ku", "kua", "kuai", "kuan", "kuang", "kui", "kun", "kuo", "la", "lai", "lan", "lang", "lao", "le", "lei", "leng", "li", "lia", "lian", "liang", "liao", "lie", "lin", "ling", "liu", "long", "lou", "lu", "luan", "lue", "lun", "luo", "ma", "mai", "man", "mang", "mao", "me", "mei", "men", "meng", "mi", "mian", "miao", "mie", "min", "ming", "miu", "mo", "mou", "mu", "na", "nai", "nan", "nang", "nao", "ne", "nei", "nen", "neng", "ni", "nian", "niang", "niao", "nie", "nin", "ning", "niu", "nong", "nou", "nu", "nuan", "nuo", "nun", "o", "ou", "pa", "pai", "pan", "pang", "pao", "pei", "pen", "peng", "pi", "pian", "piao", "pie", "pin", "ping", "po", "pou", "pu", "qi", "qia", "qian", "qiang", "qiao", "qie", "qin", "qing", "qiong", "qiu", "qu", "quan", "que", "qun", "ran", "rang", "rao", "re", "ren", "reng", "ri", "rong", "rou", "ru", "ruan", "rui", "run", "ruo", "sa", "sai", "san", "sang", "sao", "se", "sen", "seng", "sha", "shai", "shan", "shang", "shao", "she", "shei", "shen", "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang", "shui", "shun", "shuo", "si", "song", "sou", "su", "suan", "sui", "sun", "suo", "ta", "tai", "tan", "tang", "tao", "te", "teng", "ti", "tian", "tiao", "tie", "ting", "tong", "tou", "tu", "tuan", "tui", "tun", "tuo", "wa", "wai", "wan", "wang", "wei", "wen", "weng", "wo", "wu", "xi", "xia", "xian", "xiang", "xiao", "xie", "xin", "xing", "xiong", "xiu", "xu", "xuan", "xue", "xun", "ya", "yan", "yang", "yao", "ye", "yi", "yin", "ying", "yo", "yong", "you", "yu", "yuan", "yue", "yun", "za", "zai", "zan", "zang", "zao", "ze", "zei", "zen", "zeng", "zha", "zhai", "zhan", "zhang", "zhao", "zhe", "zhei", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu", "zhua", "zhuai", "zhuan", "zhuang", "zhui", "zhun", "zhuo", "zi", "zong", "zou", "zu", "zuan", "zui", "zun", "zuo"]

a = ["a", "b", "c"]

shuanglist = []

# 这里的实现丑爆了,路过的大神看到麻烦帮改成个pythonic的方式
for x in dan:
    for y in dan:
        shuanglist.append(x+y)

print shuanglist
print len(dan)
print len(shuanglist)

r = redis.Redis(host='localhost', port=6379, db=0)

for item in set(shuanglist):
    r.sadd('shuangpin', item)

speedtest.py 单线程的请求数据

#!/bin/env python
#encoding:utf-8
from multiprocessing import Pool
from bs4 import BeautifulSoup
import time
import requests

def get_Data(url):
    start = time.time()
    page = requests.get(url).text
    print page
    # soup = BeautifulSoup(page, 'html.parser')
    # title = soup.find_all('body')[0].text
    end = time.time()
    print '%s runs %0.2f seconds.' % (page, (end - start))

if __name__=='__main__':

    url_list = []

    f = file("10w.txt", "r")
    row = f.readline()
    while row:
        url =  "http://127.0.0.1:8000/check/" + row[0:-2] + "/"
        url_list.append(url);
        row = f.readline()

    print len(url_list)

    print 'Waiting for ...'
    t1 = time.time()
    for url in url_list:
        get_Data(url)

    t2 = time.time()
    print 'Done. use %0.2f seconds' % (t2-t1)

speedtest-multi.py 多进程(4)请求数据

#!/bin/env python
#encoding:utf-8
from multiprocessing import Pool
from bs4 import BeautifulSoup
import os, time
import requests

def get_Data(url):
    start = time.time()
    page = requests.get(url).text
    print page
    # soup = BeautifulSoup(page, 'html.parser')
    # title = soup.find_all('body')[0].text
    end = time.time()
    print '%s runs %0.2f seconds.' % (page, (end - start))

if __name__=='__main__':

    t1 = time.time()
    print 'Parent process %s.' % os.getpid()
    p = Pool(processes=4)

    url_list = []

    f = file("10w.txt", "r")
    row = f.readline()
    while row:
        url =  "http://127.0.0.1:8078/check/" + row[0:-2] + "/"
        url_list.append(url);
        row = f.readline()

    print len(url_list)

    for url in url_list:
        p.apply_async(get_Data, args=(url,))

    print 'Waiting for all subprocesses done...'
    p.close()
    p.join()
    t2 = time.time()

    print 'All subprocesses done. use %0.2f seconds' % (t2-t1)

其实bs4也没什么必要,这个测试不用网页,直接解析接口可以更快很多,不过这个是以前写的脚本,拿来就用方便好多,主要实验是用来做比较也就无所谓了

如果以后有机会了可以再深入的实验一下,更多的“单拼”,达到什么程度用Redis比正则更有优势,也可以测试下没有CPU的瓶颈下使用了Hiredis的Redis的极限是多少,现在基本目的已经达到,手里的设备也仅能实验到这里,小留悬念,以后继续折腾 ^-^