广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python 性能提升之 并行map
  • 856
分享到

python 性能提升之 并行map

性能pythonmap 2023-01-31 04:01:25 856人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

前段时间进行单一目录下10万张图片发送,效果很差,数据积压原来越多。 性能问题提上议程。 采用多线程 多进程 感觉比较繁琐,网上有介绍 map的并行处理的,使用后性能提高明细。 网上介绍map如下 介绍:Map Map是一个很棒的小功能

前段时间进行单一目录下10万张图片发送,效果很差,数据积压原来越多。

性能问题提上议程。

采用多线程 多进程 感觉比较繁琐,网上有介绍 map的并行处理的,使用后性能提高明细。

网上介绍map如下

介绍:Map

Map是一个很棒的小功能,同时它也是python并行代码快速运行的关键。给不熟悉的人讲解一下吧,map是从函数语言Lisp来的。map函数能够按序映射出另一个函数。例如

urls = ['Http://www.yahoo.com', 'http://www.reddit.com']
results = map(urllib2.urlopen, urls)

这里调用urlopen方法来把调用结果全部按序返回并存储到一个列表里。就像:

results = []
for url in urls:
  results.append(urllib2.urlopen(url))

Map按序处理这些迭代。调用这个函数,它就会返回给我们一个按序存储着结果的简易列表。

为什么它这么厉害呢?因为只要有了合适的库,map能使并行运行得十分流畅!
这里写图片描述
有两个能够支持通过map函数来完成并行的库:一个是multiprocessing,另一个是鲜为人知但功能强大的子文件:multiprocessing.dummy。

题外话:这个是什么?你从来没听说过dummy多进程库?我也是最近才知道的。它在多进程的说明文档里面仅仅只被提到了一句。而且那一句就是大概让你知道有这么个东西的存在。我敢说,这样几近抛售的做法造成的后果是不堪设想的!

Dummy就是多进程模块的克隆文件。唯一不同的是,多进程模块使用的是进程,而dummy则使用线程(当然,它有所有Python常见的限制)。也就是说,数据由一个传递给另一个。这能够使得数据轻松的在这两个之间进行前进和回跃,特别是对于探索性程序来说十分有用,因为你不用确定框架调用到底是io 还是CPU模式。

准备开始

要做到通过map函数来完成并行,你应该先导入装有它们的模块:

from multiprocessing import Pool
from multiprocessing.dummy import Pool as ThreadPool

再初始化:

pool = ThreadPool()

这简单的一句就能代替我们的build_worker_pool 函数在example2.py中的所有工作。换句话说,它创建了许多有效的worker,启动它们来为接下来的工作做准备,以及把它们存储在不同的位置,方便使用。

Pool对象需要一些参数,但最重要的是:进程。它决定pool中的worker数量。如果你不填的话,它就会默认为你电脑的内核数值。

如果你在CPU模式下使用多进程pool,通常内核数越大速度就越快(还有很多其它因素)。但是,当进行线程或者处理网络绑定之类的工作时,情况会比较复杂所以应该使用pool的准确大小。

pool = ThreadPool(4) # Sets the pool size to 4

如果你运行过多线程,多线程间的切换将会浪费许多时间,所以你最好耐心调试出最适合的任务数。

使用代码效果:

没有优化前代码,性能很差,数据处理不完,积压越来越多

import linecache
import os
import os.path
import requests
import time
import datetime
import sys
reload(sys)
sys.setdefaultencoding('utf8')

imagedir='/opt/Tomcat_api/video_sendto_api/image_bak/'

def send_image(imagedir):
    #扫描图片路径
    for img_parent, img_dir_names, img_names in os.walk(imagedir):
        for img_name in img_names:
            image = os.path.join(img_parent, img_name) #拼接图片完整路径
            print time.strftime("%Y-%m-%d %X"),image
            #准备发送图片
            file = dict(file=open(image, 'rb'))
            post_data = {'mark': 'room-201', 'timestamp': 1846123456, 'random': 123}
            headers = {'app_key': app_key, 'access_token': access_token}
            result = requests.post(url, files=file, data=post_data, headers=headers, verify=False)
            print result.content
            #删除发送的图片
            str_img = "rm -f " + " " + image
            del_img = os.popen(str_img).readline()
            print del_img
if __name__ == "__main__":
    send_image(imagedir)

采用map 代码,效果处理速度明细。

拆分send_image函数。

import linecache
import os
import os.path
import requests
import time
import datetime
import sys
reload(sys)
sys.setdefaultencoding('utf8')

from multiprocessing import Pool
from multiprocessing.dummy import Pool as ThreadPool

imagedir='/opt/tomcat_api/video_sendto_api/image_bak/'

#获取扫描目录,生成列表
def get_img_path(imagedir):
    list=[]
    for img_parent, img_dir_names, img_names in os.walk(imagedir):
        for img_name in img_names:
            image = os.path.join(img_parent, img_name) #拼接图片完整路径
            list.append(image)
    return list

def send_images(image):
    file = dict(file=open(image, 'rb'))
    post_data = {'mark': 'room-201', 'timestamp': 1846123456, 'random': 123}
    headers = {'app_key': app_key, 'access_token': access_token}
    result = requests.post(url, files=file, data=post_data, headers=headers, verify=False)
    print result.content
    str_img = "rm -f " + " " + image
    del_img = os.popen(str_img).readline()
    print del_img

if __name__ == "__main__":
     image=get_img_path(imagedir)
    pool=Pool()

    pool.map(send_images,image)
    pool.close()
    pool.join()

任务不需要长时间运行,如果程序处理完毕,添加定时任务再吊起来。

crontab  11分钟检测一次。

#!/bin/bash
counter=$(ps -C video_send2api_new|wc -l)
if [ "${counter}" -le 1 ]; then
    python /opt/tomcat_api/video_sendto_api/video_send2api_new.py >>/opt/tomcat_api/video_sendto_api/logs/out.log&
fi

不错






--结束END--

本文标题: python 性能提升之 并行map

本文链接: https://www.lsjlt.com/news/188003.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python 性能提升之 并行map
    前段时间进行单一目录下10万张图片发送,效果很差,数据积压原来越多。 性能问题提上议程。 采用多线程 多进程 感觉比较繁琐,网上有介绍 map的并行处理的,使用后性能提高明细。 网上介绍map如下 介绍:Map Map是一个很棒的小功能...
    99+
    2023-01-31
    性能 python map
  • 如何使用JavaScript的Map提升性能
    这篇文章将为大家详细讲解有关如何使用JavaScript的Map提升性能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Map与常规对象有什么不同Map和常规对象主要有2个...
    99+
    2022-10-19
  • Python性能提升之延迟初始化
    所谓类属性的延迟计算就是将类的属性定义成一个property,只在访问的时候才会计算,而且一旦被访问后,结果将会被缓存起来,不用每次都计算。构造一个延迟计算属性的主要目的是为了提升性能 property 在...
    99+
    2022-06-04
    初始化 性能 Python
  • MySQL45讲之IO性能提升 - flowers
    本文介绍 MySQL 的 binlog 和 redo log 写入机制和刷盘策略,以及如何提升 MySQL 的 IO 性能。 前言 本文介绍 MySQL 的 binlog 和 redo log...
    99+
    2015-04-27
    MySQL45讲之IO性能提升 - flowers
  • 提升Python运行性能的习惯有哪些
    本篇内容主要讲解“提升Python运行性能的习惯有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“提升Python运行性能的习惯有哪些”吧!1、使用局部变量使用局部变量替换模块名字空间中的变量...
    99+
    2023-06-02
  • Python 接口 api 并发:如何提高并行性能?
    在现代软件开发中,API 已经成为了必不可少的一部分。然而,对于高流量的应用程序来说,API 的性能往往是一个瓶颈。这时候,我们就需要使用并发来提高 API 的性能。 Python 是一种流行的编程语言,它提供了多种并发技术来提高程序的性...
    99+
    2023-07-19
    接口 api 并发
  • python 性能提升的几种方法
    关于python 性能提升的一些方案。 一、函数调用优化(空间跨度,避免访问内存) 程序的优化核心点在于尽量减少操作跨度,包括代码执行时间上的跨度以及内存中空间跨度。 1.大数据求和,使用sum a...
    99+
    2022-06-04
    几种方法 性能 python
  • Python编程通过懒属性提升性能
    目录为什么需要懒加载如何使用懒加载最后的话懒加载是一种编程范式,它推迟加载操作,直到不得不这样做。通常,当操作开销很大,需要耗费大量时间或空间时,惰性求值是首选实现。例如,在 Pyt...
    99+
    2022-11-12
  • Python性能提升的方法有哪些
    本篇内容介绍了“Python性能提升的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!时序分析优化之前,首先要找到是哪部分代码拖慢了...
    99+
    2023-06-16
  • 应用OSCache提升J2EE系统运行性能
    文章摘要Cache是一种用于提高系统响应速度、改善系统运行性能的技术。尤其是在Web应用中,通过缓存页面的输出结果,可以很显著的改善系统运行性能。本文中作者给大家介绍一个实现J2EE框架中Web应用层缓存功能的开放源代码项目----OSCa...
    99+
    2023-06-03
  • Laravel 容器中的 Python:如何提升性能?
    Laravel 是一个使用 PHP 编写的开源 Web 应用程序框架,它使用了一些强大的工具来帮助开发者快速构建 Web 应用程序。其中一个强大的工具是 Laravel 容器,它提供了一种简单而有效的方式来管理应用程序中的对象依赖关系。 然...
    99+
    2023-07-08
    响应 容器 laravel
  • 项目实战:使用Go WaitGroup提升Golang并发性能
    在Go语言中,我们可以使用sync.WaitGroup来提升并发性能。sync.WaitGroup是一个计数信号量,它可以用来等待一...
    99+
    2023-10-20
    Golang
  • Redis性能大幅提升之Batch批量读写详解
    前言 本文主要介绍的是关于Redis性能提升之Batch批量读写的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 提示:本文针对的是StackExchange.Redis 一、问题呈现 前段时间在...
    99+
    2022-06-04
    批量 详解 大幅
  • php-fpm怎么进行优化来提升性能
    这篇文章主要讲解了“php-fpm怎么进行优化来提升性能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php-fpm怎么进行优化来提升性能”吧!PHP是无处不在的,可以说是互联网 Web 应...
    99+
    2023-06-30
  • Apache 服务器的负载均衡能否提升 PHP 并发性能?
    Apache 服务器是一款广泛使用的 Web 服务器软件,而负载均衡则是一种常用的提升系统性能的方式。那么,Apache 服务器的负载均衡能否提升 PHP 并发性能呢? 在回答这个问题之前,我们先来了解一下什么是负载均衡。负载均衡是一种将请...
    99+
    2023-09-22
    并发 unix apache
  • Python 缓存技术如何提升 Django 的性能?
    Django 是一个广受欢迎的 Python Web 框架,它提供了许多强大的功能,如 ORM、模板引擎、自动化管理等,但在处理大量请求时,性能可能成为一个问题。在这种情况下,缓存技术是一个非常有用的工具,可以显著提高 Django 应用...
    99+
    2023-10-23
    缓存 django windows
  • 提升Python程序性能的习惯有哪些
    本篇内容介绍了“提升Python程序性能的习惯有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、使用局部变量尽量使用局部变量代替全局变...
    99+
    2023-07-06
  • 通过Golang的同步机制提升程序的并发能力与性能
    在Golang中,可以使用同步机制来提升程序的并发能力和性能。下面是一些可用的同步机制:1. 互斥锁(Mutex):互斥锁可以用来保...
    99+
    2023-10-10
    Golang
  • 怎么进行CSS代码减肥提升前端性能
    本篇内容介绍了“怎么进行CSS代码减肥提升前端性能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用工具这...
    99+
    2022-10-19
  • 如何用迭代器设计模式提升Python性能
    本篇内容介绍了“如何用迭代器设计模式提升Python性能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!简单案例在开始介绍设计模式之前,我们先...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作