任务

def single():
# 单进程单线程实现
s = 0
for i in range(1, N):
s += math.sqrt(i)
return s

结论

  • Python多线程无法利用多核
  • Python多进程可以利用多核
  • Numpy速度远超并行的Python代码
  • twisted无法利用多核

实现

import math
import multiprocessing
import threading
import timeit import numpy as np
from twisted.internet import reactor
import time N = 10000000 def single():
# 单进程单线程实现
s = 0
for i in range(1, N):
s += math.sqrt(i)
return s def useThread():
# 多线程实现
total_sum = 0 def go(beg, end):
nonlocal total_sum
s = 0
for i in range(beg, end):
s += math.sqrt(i)
total_sum += s # python无法利用多核,所以这句话每个时刻只有一个线程在执行 thread_count = 4
per = math.ceil(N / thread_count)
thread_list = []
for i in range(thread_count):
th = threading.Thread(target=go, args=(i * per, (i + 1) * per))
thread_list.append(th)
th.start()
for th in thread_list:
th.join()
return total_sum def useMultiprocess():
# 使用多进程
def go(q: multiprocessing.Queue, beg, end):
s = 0
for i in range(beg, end):
s += math.sqrt(i)
q.put(s) process_count = 4
per = math.ceil(N / process_count)
process_list = [] q = multiprocessing.Queue()
for i in range(process_count):
th = multiprocessing.Process(target=go, args=(q, i * per, (i + 1) * per))
process_list.append(th)
th.start()
for th in process_list:
th.join()
total_sum = 0
try:
while 1:
x = q.get_nowait()
total_sum += x
except:
pass
return total_sum def useTwisted():
# reactor是单例模式,一个进程只有一个reactor,一个reactor包括多个线程
total_sum = 0
ok_count = 0
thread_count = 4 def go(beg, end):
nonlocal total_sum
s = 0
for i in range(beg, end):
s += math.sqrt(i)
reactor.callFromThread(accumulate, s) def accumulate(s):
nonlocal total_sum
nonlocal ok_count
ok_count += 1
if ok_count == thread_count:
reactor.stop()
total_sum += s def process_work(q):
reactor.suggestThreadPoolSize(thread_count)
per = math.ceil(N / thread_count)
for i in range(thread_count):
reactor.callInThread(go, i * per, i * per + per)
reactor.run()
q.put(total_sum) q = multiprocessing.Queue()
p = multiprocessing.Process(target=process_work, args=(q,))
p.start()
p.join()
return q.get() def useTwisted2():
# reactor是单例模式,一个进程只有一个reactor,一个reactor包括一个线程
total_sum = 0
thread_count = 4
ok_count = 0
beg_time = time.time() def go(beg, end):
nonlocal total_sum
s = 0
for i in range(beg, end):
s += math.sqrt(i)
reactor.callFromThread(accumulate, s) def accumulate(s):
nonlocal total_sum
nonlocal ok_count
total_sum += s
ok_count += 1
if ok_count == thread_count:
print(time.time() - beg_time, "value", total_sum) reactor.suggestThreadPoolSize(thread_count)
per = math.ceil(N / thread_count)
for i in range(thread_count):
reactor.callInThread(go, i * per, i * per + per) def useNumpy():
a = np.linspace(1, N, N)
return np.sum(np.sqrt(a)) def main():
for method in (single, useThread, useMultiprocess, useNumpy, useTwisted, useTwisted2):
print(method.__name__, "result", method(), "time", timeit.timeit(method, number=10))
reactor.run() if __name__ == '__main__':
main()

twisted无法利用多核

from twisted.internet import threads, reactor
import time
import math beg_time = time.time() def go():
print("go start")
s = 0
for i in range(10000000):
s += math.sqrt(i + 1)
print("go over", time.time() - beg_time) import timeit reactor.suggestThreadPoolSize(8)
print(timeit.timeit(go, number=1))
for i in range(10):
reactor.callInThread(go)
reactor.run()

Python并行实例的更多相关文章

  1. python生成器并行实例

    生成器并行实例: send发送值被yield接受到赋值给baozi变量 #yield作用只是在这里保存这个值的当前状态然后返回之后在调用next,又回到yield #单纯调用next不会给yield传 ...

  2. Python 并行分布式框架 Celery

    Celery 简介 除了redis,还可以使用另外一个神器---Celery.Celery是一个异步任务的调度工具. Celery 是 Distributed Task Queue,分布式任务队列,分 ...

  3. 【转】Python 并行分布式框架 Celery

    原文链接:https://blog.csdn.net/freeking101/article/details/74707619 Celery 官网:http://www.celeryproject.o ...

  4. python基础——实例属性和类属性

    python基础——实例属性和类属性 由于Python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(objec ...

  5. python 发送邮件实例

    留言板回复作者邮件提醒 -----------2016-5-11 15:03:58-- source:python发送邮件实例

  6. python Cmd实例之网络爬虫应用

    python Cmd实例之网络爬虫应用 标签(空格分隔): python Cmd 爬虫 废话少说,直接上代码 # encoding=utf-8 import os import multiproces ...

  7. Python爬虫实例:爬取B站《工作细胞》短评——异步加载信息的爬取

    很多网页的信息都是通过异步加载的,本文就举例讨论下此类网页的抓取. <工作细胞>最近比较火,bilibili 上目前的短评已经有17000多条. 先看分析下页面 右边 li 标签中的就是短 ...

  8. Python爬虫实例:爬取猫眼电影——破解字体反爬

    字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...

  9. Python爬虫实例:爬取豆瓣Top250

    入门第一个爬虫一般都是爬这个,实在是太简单.用了 requests 和 bs4 库. 1.检查网页元素,提取所需要的信息并保存.这个用 bs4 就可以,前面的文章中已经有详细的用法阐述. 2.找到下一 ...

随机推荐

  1. ECMAScript 原始类型

    ---恢复内容开始--- ECMAScript 有 5 种原始类型(primitive type),即 Undefined.Null.Boolean.Number 和 String. 1.typeof ...

  2. 003.MySQL高可用主从复制新增slave

    一 基础环境 主机名 系统版本 MySQL版本 主机IP master CentOS 6.8 MySQL 5.6 172.24.8.10 slave01 CentOS 6.8 MySQL 5.6 17 ...

  3. linux 学习笔记 wc命令

    #wc 文件名.txt 输出 4 13 65 文件名.txt  -->4 行13个单词 #wc -w 文件名.txt  统计单词数量 #wc -l 文件名.txt  统计行数 #wc -c  文 ...

  4. PHP学习笔记 ThinkPHP

    //检测文件是否存在 if(!file_exists(dirname(__FILE__)."/Bo/Admin/Conf/config.php")) { header('Locat ...

  5. C#Windows窗体界面设计_05_添加菜单栏 工具栏 状态栏 按钮

  6. Codeforces.1110F.Nearest Leaf(线段树)

    题目链接 \(dls\)讲过这道题,所以这不是线段树裸题吗,这场没打气气气气气=-= 现在是写着玩=v= \(Description\) 给定一棵\(n\)个点的树.\(q\)次询问,每次询问给定\( ...

  7. Linux基础操作整理

    1,目录操作 1.1创建目录 1.1.1使用 mkdir 命令创建目录:mkdir $HOME/testFolder 1.2切换目录 1.2.1使用 cd 命令切换目录:cd $HOME/testFo ...

  8. 潭州课堂25班:Ph201805201 django 项目 第二十一课 文章主页 新闻列表页面功能 (课堂笔记)

    新闻列表页功能 1.分析 业务处理流程: 判断前端传的标签分类id是否为空,是否为整数.是否超过范围 判断前端传的当前文章页数是否为空,是否为整数.是否超过范围 请求方法:GET url定义:/new ...

  9. [SPOJ-CIRU]The area of the union of circles/[BZOJ2178]圆的面积并

    [SPOJ-CIRU]The area of the union of circles/[BZOJ2178]圆的面积并 题目大意: 求\(n(n\le1000)\)个圆的面积并. 思路: 对于一个\( ...

  10. Mysql建库建用户建表等常用命令

    格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输 ...