Python并行实例
任务
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并行实例的更多相关文章
- python生成器并行实例
生成器并行实例: send发送值被yield接受到赋值给baozi变量 #yield作用只是在这里保存这个值的当前状态然后返回之后在调用next,又回到yield #单纯调用next不会给yield传 ...
- Python 并行分布式框架 Celery
Celery 简介 除了redis,还可以使用另外一个神器---Celery.Celery是一个异步任务的调度工具. Celery 是 Distributed Task Queue,分布式任务队列,分 ...
- 【转】Python 并行分布式框架 Celery
原文链接:https://blog.csdn.net/freeking101/article/details/74707619 Celery 官网:http://www.celeryproject.o ...
- python基础——实例属性和类属性
python基础——实例属性和类属性 由于Python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(objec ...
- python 发送邮件实例
留言板回复作者邮件提醒 -----------2016-5-11 15:03:58-- source:python发送邮件实例
- python Cmd实例之网络爬虫应用
python Cmd实例之网络爬虫应用 标签(空格分隔): python Cmd 爬虫 废话少说,直接上代码 # encoding=utf-8 import os import multiproces ...
- Python爬虫实例:爬取B站《工作细胞》短评——异步加载信息的爬取
很多网页的信息都是通过异步加载的,本文就举例讨论下此类网页的抓取. <工作细胞>最近比较火,bilibili 上目前的短评已经有17000多条. 先看分析下页面 右边 li 标签中的就是短 ...
- Python爬虫实例:爬取猫眼电影——破解字体反爬
字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...
- Python爬虫实例:爬取豆瓣Top250
入门第一个爬虫一般都是爬这个,实在是太简单.用了 requests 和 bs4 库. 1.检查网页元素,提取所需要的信息并保存.这个用 bs4 就可以,前面的文章中已经有详细的用法阐述. 2.找到下一 ...
随机推荐
- Jenkins使用遇到的问题总结
学新技能最方便的就是在网上找教程了,我找到一个还不错的易百教程 Jenkins教程 别看教程写了一堆,其实真正用到的没多少.后面的自动化测试,服务器维护啥的,等用到的时候再深入研究吧 No1: 按照教 ...
- Typescript中抽象类与接口详细对比与应用场景介绍
现如今,TS正在逐渐成为前端OO编程的不二之选,以下是我在学习过程中对抽象类和接口做的横向对比. 1. 抽象类当做父类,被继承.且抽象类的派生类的构造函数中必须调用super():接口可以当做“子类” ...
- angular笔记_5(全选/反选)
全选和反选 BUG:当鼠标点击其中一个选项后,在点击全选按钮,该选项失效 <!DOCTYPE html><html lang="en"><head&g ...
- 在Qt项目中添加全局宏变量来达到按方案编译的目的
遇到一个需求,需要根据不同需要编译所需程序,本人采用了在QtCreator中建立不同的构建设置,配合宏的方式来实现: 1.在项目-构建设置中,添加构建配置2.在构建步骤里的qmake中的额外参数一栏填 ...
- 蓝桥杯——代表团出访——C++
问题描述: X星球要派出一个5人组成的观察团前往W星. 其中: A国最多可以派出4人. B国最多可以派出2人. C国最多可以派出2人. D国最多可以派出1人. E国最多可以派出1人. F国最多可以派出 ...
- 权限框架Apache Shiro 和 Spring Security
Shiro 首先Shiro较之 Spring Security,Shiro在保持强大功能的同时,还在简单性和灵活性方面拥有巨大优势.Shiro是一个强大而灵活的开源安全框架,能够非常清晰的处理认证.授 ...
- MVC微型框架---------学习
1.单一入口机制 是指在web程序中 所有的请求都指向一个脚本文件 2.工厂模式的概念精髓:工厂类就是对类的封装,类是对方法的封装,方法是对实现过程的封装调用当前类的静态方法,规范的写法是使用 sel ...
- PowerShell一次执行多条命令
PowerShell一次执行多条命令语句 使用CMD之后换到PS之后想一次执行多条命令会很不习惯,因为原来的&&语句连接符已经不能用了. 在各种搜索后没有发现网上有说明这个的.无奈只能 ...
- BZOJ3252攻略——长链剖分+贪心
题目描述 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX 半岛>,这款游戏有n个场景(scene),某 ...
- 反编译安卓apk以及jar包
https://www.jianshu.com/p/c9b553cf2b51 https://blog.csdn.net/bzlj2912009596/article/details/78268896