2015-10-18 69 views
0

我现在有80个用户名的列表,我有我的脚本检查每个用户名是否存在。然而,它需要比我喜欢的时间长一点,所以我想知道是否有任何事情可以做,以加快需要多长时间来检查每个用户名是否存在。任何可能的方式来加快处理这个?

# ------------------------------ 
# Mass Kik Username Checker 
# Script Made by: Ski 
# ------------------------------ 

import requests, threading 

def check(username): 
    try: 
     req = requests.get("http://kik.me/"+username, allow_redirects=False).status_code 

     if req == 302: 
      return False 
     if req == 200: 
      return True 
    except Exception as e: 
     print e 
     exit() 


def _loadList(filename): 
    item_list = [] 
    for item in str(open(filename, "r").read()).split("\n"): 
     item_list.append(item) 
    return item_list 

def _thread(items): 
    global _usernames 
    for username in _usernames[items[0]:items[1]]: 
     exists = check(username) 

     if exists: 
      print username+" exists\n" 
     if not exists: 
      print username+" doesn't exist\n" 

if __name__ == '__main__': 
    _usernames = _loadList("usernames.txt") 

    thread1 = threading.Thread(target=_thread, args=([0, 20],)).start() 
    thread2 = threading.Thread(target=_thread, args=([20, 40],)).start() 
    thread3 = threading.Thread(target=_thread, args=([40, 60],)).start() 
    thread4 = threading.Thread(target=_thread, args=([60, 80],)).start() 
+1

使用概要分析来确定你的瓶颈 – Moritz

+0

莫里茨也是一个不错的建议,但如果它是不完全清楚,他是指的是'profile'和'cProfile'标准库模块。 'cProfile'是首选。 –

+0

创建超过4个工作线程的池,为什么不是80或更多。并使用队列与线程通信,而不是全局变量(这不是为了性能,而是为了代码的正确性)。 – uselpa

回答

1

试用Python 3.x Pool of threads。您可以定义有多少员工执行请求。使用比4更多(例如32),将会显着加快代码速度。

import requests 
from concurrent.futures import ThreadPoolExecutor 


NUM_OF_WORKERS=32 


def check(username): 
    try: 
     req = requests.get("http://kik.me/"+username, allow_redirects=False).status_code 

     if req == 302: 
      print(username, " does not exist.") 
     if req == 200: 
      print(username, "exists.") 
    except Exception as error: 
     print(error) 


usernames = _loadList(filename) 

with ThreadPoolExecutor(max_workers=NUM_OF_WORKERS) as pool: 
    pool.map(check, usernames) 

这使得您的代码方式更具可读性为好。

编辑:现在注意到Python 2.7标记。

Python 2有一个线程池,可在multiprocessing模块下使用。不幸的是,它没有记录,因为没有测试可用。

import requests 
from multiprocessing.pool import ThreadPool 


NUM_OF_WORKERS=32 


def check(username): 
    try: 
     req = requests.get("http://kik.me/"+username, allow_redirects=False).status_code 

     if req == 302: 
      print(username, " does not exist.") 
     if req == 200: 
      print(username, "exists.") 
    except Exception as error: 
     print(error) 


usernames = _loadList(filename) 


pool = ThreadPool(processes=NUM_OF_WORKERS) 
pool.map_async(check, usernames) 
pool.close() 
pool.join() 

如果你想线程的Python的2更好的游泳池,你可以尝试Pebble module

+0

大声笑,我测试了一些完全随机的用户名的脚本,并得到了一些现有的。 “barnawi”例如xD – noxdafox

+0

问题标签为python2.7 –

+0

修复了答案 – noxdafox

相关问题