Python 巧妙的实现并行

需求

  给定一个list   针对list 中每个元素执行一定的操作(这个操作很费时间,例如爬数据的时候调用某个网站的接口),返回操作后的list

  例如 给定 1-10个数,在每个数字后面加个字母a

方法

1、利用线程池pool 及map 函数 实现

 1 from multiprocessing import Pool
 2 from multiprocessing.dummy import Pool as ThreadPool
 3 import time
 4 pool = ThreadPool(10)
 5
 6 #定义函数
 7 def add(x):
 8     time.sleep(0.2)
 9     return str(x) + ‘a‘
10
11 ll = list(range(0,10))
12
13
14 #原始map
15 start = time.time()
16 res = map(add, ll)
17 print res
18 print time.time() - start
19
20 #线程池map
21 start = time.time()
22 res = pool.map(add,ll)
23 print res
24 print time.time() - start

结论:

可以发现 运行时间缩短了。一定要保证所执行的函数比较费时间,才可以用,否则 大部分时间都用在分发任务上了,

多线程不一定比单线程快。 感兴趣的同学可以试试把time.sleep()去掉。

参考:

http://python.jobbole.com/81690/

原文地址:https://www.cnblogs.com/zle1992/p/8431312.html

时间: 2024-10-23 19:01:31

Python 巧妙的实现并行的相关文章

Python面试简介及并行并发

今天的分享内容大体如下: 一. 面试 1. 什么是面试 2. 优秀的面试 二. Python综述 1. Python设计哲学及版本变迁 2. Python发展现状及其他语言使用场景 3. GIL 4. 内存管理和垃圾回收 5. 面试示例 三.并发并行 1. 进程 2. 线程 3. 协程 4. 并发编程 一. 面试 什么是面试 面:当面/面谈/面聊, 试:考试,当前社会上各大企业和公司招人环节中最重要的一道流程关卡:目前面试已经衍生了多种操作形式:直面.电面.视频面.在线coding: 一轮面试的

Python之并发、并行、阻塞、非租塞、同步、异步、IO多路复用

一.并发并行 并发:表示执行多个任务的能力 并行:表示同一时刻执行多个任务 二.模拟socket发送http请求 三大步骤:创建连接 要发送的东西 然后数据回来接收    socket默认情况下阻塞 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 import socket 5 6 client = socket.socket() 7 client.setblocking(False) # 这里设置非阻塞 8 # 百度创建连接:阻塞 9

python 的串行和并行

import asyncio import time #串行 #asyncio.run() async def say_after(delay, what): await asyncio.sleep(delay) print(what) async def main(): print(f"started at {time.strftime('%X')}") await say_after(2, 'hello') await say_after(1, 'world') print(f&q

python实现简单的并行矩阵乘法

本文采用的矩阵乘法方式是利用一个矩阵的行和二个矩阵的列相乘时不会互相影响.假设A(m,n)表示矩阵的m行,n列.那么C(m,m)=A(m,n) B(n,m) :计算C矩阵时候分解成:process-1:C(1,1) = A(1,:) B(:,1) process-2:C(1,2) = A(1,:) * B(:,2) .......... process-mC(m,m) = A(m,:) * B(:,m) 实现源码:import multiprocessing #导入多进程模块,实现多进程impo

Python的面向对象、Class 概念与使用

Class(类)的基本概念: 类:将同一种具体事务的共同点抽象出来的表现,Python的类是一种可调用对象. 类中定义的有方法,变量,数据结构. 变量则是类属性本身是没有数据的,只有在实例化的时候将数据引入. 方法就是函数:是操作变量引用的数据的代码,可以知道方法是操作数据的,由于类中不包含数据,所以类无法调用方法,只有实例化引入数据成为实例(也称为对象)才可以调用方法. 对象的由来: 对象(也称为实例)本身是没有方法的,对象引用的方法是在类中定义的也叫类函数,或者叫接口. 同属一类实例化的对象

深入super,看Python如何解决钻石继承难题

1.   Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类 class Base(object): def __init__(self): print “Base init” 则普通方法如下 class Leaf(Base): def __init__(self): Base.__init__(self) print “Leaf init” super方法如下 class Leaf(Base): def __init_

(转载)深入super,看Python如何解决钻石继承难题

1.   Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类 class Base(object): def __init__(self): print "Base init" 则普通方法如下 class Leaf(Base): def __init__(self): Base.__init__(self) print "Leaf init" super方法如下 class Leaf(Bas

python --- mulitprocessing(多进程)模块使用

1. 什么是进程? 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代面向线程设计的计算机结构中,进程是线程的容器. 一个进程至少包含一个线程. 2. 在python中有了多线程编程为何还需要多进程编程? 在python中由于有GIL(全局解释器锁)的存在,在任一时刻只有一个线程在运行(无论你的CPU是多少核),无法实现真正的多线程.那么该如何让pyth

python 面向对象十一 super函数

super函数用来解决钻石继承. 一.python的继承以及调用父类成员 父类: class Base(object): def __init__(self): print("base init.") 普通方法调用父类: class Leaf(Base): def __init__(self): Base.__init__(self) print("Leaf init.") super方法调用父类: class Leaf(Base): def __init__(se