利用python多进程加速日常工作中的for循环操作,如处理数据集

chatgpt赋能python:如何加速Python中的for循环操作 本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。🧡AI职场汇报智能办公文案写作效率提升教程 🧡专注于AI+职场+办公方向。下图是课程的整体大纲下图是AI职场汇报智能办公文案写作效率提升教程中用到的ai工具。 阅读详情
  • https://blog.csdn.net/u011345885/article/details/123767679
  • 要尝试使用多线程而不是多进程,只需执行from multiprocessing.pool import ThreadPool并将代码中的Pool替换为ThreadPool
  • https://blog.csdn.net/weixin_46554582/article/details/115701664
  • Python多重处理:map和imap有什么区别?
    是map返回实际数组或集合,而imap返回数组或集合上的迭代器iterator,需要用list(iterator)返回一个list,之所以可以使用imap而不是map的一个原因是,如果您想开始处理前几个结果而无需等待其余结果被计算出来。map等待所有结果,然后返回。
  • https://www.cnblogs.com/wangjunjiehome/p/14596321.html

进程和线程是计算机软件领域里很重要的概念,进程和线程有区别,也有着密切的联系,先来辨析一下这两个概念:

1.定义

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

2.关系

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.

相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。

3.区别

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

  1. 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

  2. 线程的划分尺度小于进程,使得多线程程序的并发性高。

  3. 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

  4. 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

  5. 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

4.优缺点

线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。

这篇文章主要讲多进程在Python中的应用

Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。

子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getpid()就可以拿到父进程的ID。

python的os模块封装了常见的系统调用,其中就包括fork,可以在Python程序中轻松创建子进程:


import os
 
print('Process (%s) start...' % os.getpid())
# Only works on Unix/Linux/Mac:
pid = os.fork()
if pid == 0:
  print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()))
else:
  print('I (%s) just created a child process (%s).' % (os.getpid(), pid))

运行结果如下:

Process (876) start…
I (876) just created a child process (877).
I am child process (877) and my parent is 876.

由于Windows没有fork调用,上面的代码在Windows上无法运行。

有了fork调用,一个进程在接到新任务时就可以复制出一个子进程来处理新任务,常见的Apache服务器就是由父进程监听端口,每当有新的http请求时,就fork出子进程来处理新的http请求。

multiprocessing

如果你打算编写多进程的服务程序,Unix/linux无疑是正确的选择。由于Windows没有fork调用,难道在Windows上无法用Python编写多进程的程序?

由于Python是跨平台的,自然也应该提供一个跨平台的多进程支持。multiprocessing模块就是跨平台版本的多进程模块。

multiprocessing模块提供了一个Process类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束:

from multiprocessing import Process
import os
 
# 子进程要执行的代码
def run_proc(name):
  print('Run child process %s (%s)...' % (name, os.getpid()))
 
if __name__=='__main__':
  print('Parent process %s.' % os.getpid())
  p = Process(target=run_proc, args=('test',))
  print('Child process will start.')
  p.start()
  p.join()
  print('Child process end.')

创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例,用start()方法启动,这样创建进程比fork()还要简单。

join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步。

Pool

如果要启动大量的子进程,可以用进程池的方式批量创建子进程:

from multiprocessing import Pool
import os, time, random
 
def long_time_task(name):
  print('Run task %s (%s)...' % (name, os.getpid()))
  start = time.time()
  time.sleep(random.random() * 3)
  end = time.time()
  print('Task %s runs %0.2f seconds.' % (name, (end - start)))
 
if __name__=='__main__':
  print('Parent process %s.' % os.getpid())
  p = Pool(4)
  for i in range(5):
    p.apply_async(long_time_task, args=(i,))
  print('Waiting for all subprocesses done...')
  p.close()
  p.join()
  print('All subprocesses done.')
  • 计算密集型 vs. IO密集型,在高性能服务器上可以直接多进程,更快更好。
  1. 多线程

多任务可以由多进程完成,也可以由一个进程内的多线程完成。进程是由若干线程组成的,一个进程至少有一个线程。

由于线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,Python也不例外,并且,Python的线程是真正的Posix Thread,而不是模拟出来的线程。

Python的标准库提供了两个模块:_thread 和 threading,_thread是低级模块,threading是高级模块,对_thread进行了封装。绝大多数情况下,我们只需要使用threading这个高级模块。

启动一个线程就是把一个函数传入并创建Thread实例,然后调用start()开始执行:

import time, threading
 
# 新线程执行的代码:
def loop():
  print('thread %s is running...' % threading.current_thread().name)
  n = 0
  while n < 5:
    n = n + 1
    print('thread %s >>> %s' % (threading.current_thread().name, n))
    time.sleep(1)
  print('thread %s ended.' % threading.current_thread().name)
 
print('thread %s is running...' % threading.current_thread().name)
t = threading.Thread(target=loop, name='LoopThread')
t.start()
t.join()
print('thread %s ended.' % threading.current_thread().name)
thread MainThread is running...
thread LoopThread is running...
thread LoopThread >>> 1
thread LoopThread >>> 2
thread LoopThread >>> 3
thread LoopThread >>> 4
thread LoopThread >>> 5
thread LoopThread ended.
thread MainThread ended.

由于任何进程默认就会启动一个线程,我们把该线程称为主线程,主线程又可以启动新的线程,Python的threading模块有个current_thread()函数,它永远返回当前线程的实例。主线程实例的名字叫MainThread,子线程的名字在创建时指定,我们用LoopThread命名子线程。名字仅仅在打印时用来显示,完全没有其他意义,如果不起名字Python就自动给线程命名为Thread-1,Thread-2……

  1. Lock

多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,而多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了。Pool()的默认大小是CPU的核数

python多进程加速for循环_Python multiprocess——多进程加速 1. 前言现在cpu动不动就是6核12进程,计算能力越来越强?当时我们真的都用上了么?在跑python代码时,请打开你的后台监控,看看python的CPU占比。如果不做特殊处理(排除你调用的库),很有可能你的代码只能占用100%,也就是一个进程,资源利用率低下。还有另外一个故事,当你的计算复杂度很高的时候,比如处理某些大文件,如果你只用一个进程,很有可能得跑24小时,为了加速,你就得想办法把你的计... 阅读详情

相关推荐

Python多进程在爬虫中的使用

如何利用多进程的方法来提高Python爬虫的速度和效率。介绍了multiprocessing库的使用,并且用验证爬到的代理IP可用性作为例子来讲述多进程方法的具体使用。

王大宝的CD 1万+

快捷:利用python多进程加速日常工作中的for循环操作

本文介绍了如何利用python多进程加速处理for循环操作的方式,该方案可以处理多进程带有返回值的情景,并结合tqdm模块动态显示进程的处理进度。

7393

Python 线程,进程,多线程多进程以及并行执行for循环笔记

Python 线程,进程,多线程多进程以及并行执行for循环笔记

算法工程师 2878

如何提高pythonfor循环效率

提高 Python for 循环的效率的方法有以下几种: 利用内置函数:使用内置函数可以加速代码的执行,例如 map() 和 filter()。 避免不必要的循环:如果可以直接使用列表推导式或生成器表达式代替 for 循环,则应该使用它们。 利用预先计算:如果可以预先计算某些值,则应该尽量预先计算。 减少循环次数:应该尽量减少循环的次数,例如,使用 while 循环代替 for 循环。 ...

weixin_42596246的博客 4709

加速 Python for 循环

在使用 Python 进行数据处理和计算时,for循环是一个非常常见的操作。然而,随着数据量的增加,单纯的for循环可能会变得缓慢,导致程序效率低下。那么,有哪些方法可以加速 Python 中的for循环操作呢?今天我们来探讨如何优化for循环,提升 Python 的运行效率。forforPython 编程中,for 循环是开发者常用的工具之一,但它的执行速度经常让人感到不满。幸运的是,有许多方法可以显著提高 for 循环的效率。

朱雀随云记的博客 1547

pythonfor循环加速_如何提高pythonfor循环的效率

对于某个城市的出租车数据,一天就有33210000条记录,如何将每辆车的数据单独拎出来放到一个专属的文件中呢?思路很简单:就是循环33210000条记录,将每辆车的数据搬运到它该去的文件中。但是对于3000多万条数据,一个一个循环太消耗时间,我花了2个小时才搬运了60万数据,算算3000万我需要花费100个小时,也就需要4-5天。并且还需要保证这五天全天开机,不能出现卡机的事故。因此,需要使用并行...

weixin_29655399的博客 9730

for 循环, 多进程并行加速

########## for 循环并行,单一参数 ############# import time import multiprocessing def do(i): print(i) time.sleep(2) if __name__ == '__main__': param = [] #假设有100次循环 for i in range(0,...

sinat_33846443的博客 4270

python多进程加快for循环_python多进程 通过for循环 join 的问题

代码如下:importosfrommultiprocessing importProcessdeffunc(num):print('in func',num,os.getpid(),os.getppid())if__name__ =='__main__':print('in main',os.getpid(),os.getppid())  p_l = []fori inrange(10):    ...

weixin_39680678的博客 1250

Python使用多进程并行加速业务操作 完整代码

需求分析。

十一月廿七风雨大作 9163

如何利用ffmpeg-python多进程处理加速视频任务:完整指南

ffmpeg-python是一个强大的Python FFmpeg绑定库,支持复杂的过滤器操作,让视频处理变得更加简单高效。在处理大量视频文件或复杂视频处理任务时,多进程处理可以显著提升效率,本文将详细介绍如何使用ffmpeg-python进行多进程视频处理优化。 ## 🚀 为什么需要多进程视频处理 视频处理通常是计算密集型任务,特别是当需要处理多个视频文件或执行复杂的滤镜操作时。传统的单进程

gitblog_00190的博客 1105

基础学习——python多进程python多线程、numba 加速

以下内容是我为了解决一个for循环遍历速度太慢问题所看的一些内容,总结了以下,虽然这个并没有解决我的问题。

Chaoy6565的博客 2338

pythonfor循环加速_如何让Python代码加速运行?

Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足。但是,有很多时候,Python 的效率并没有想象中的那么夸张。本文对一些 Python 代码加速运行的技巧进行整理。0. 代码优化原则本文会介绍不少的 Python 代码加速运行的技巧。在深入代码优化细节之前,需要了解一些代码优化基本原则。第一个基本原则是不要过早优化。很多人一开始写代码就奔着性能优化的目...

weixin_39989939的博客 5315

解放计算力:使用并行处理提升python for循环速度

在计算机科学中,“并行处理” 是指同时执行多个任务或操作的技术。它利用多个处理单元或线程来并发执行任务,从而提高程序的执行速度。在 Python 中,我们可以利用多线程多进程或异步编程等技术来实现并行处理。本文介绍了如何利用并行处理技术来优化 Python 中的 for 循环,从而提高程序的执行速度。我们讨论了并行处理的概念,介绍了常用的并行处理库,以及展示了使用 multiprocessing 和 joblib 库进行并行处理的示例代码。

子午的博客 1960

python for循环加速_干货总结,24招加速你的Python代码,值得收藏

一,分析代码运行时间第1式,测算代码运行时间平凡方法快捷方法(jupyter环境)第2式,测算代码多次运行平均时间平凡方法快捷方法(jupyter环境)第3式,按调用函数分析代码运行时间平凡方法快捷方法(jupyter环境)第4式,按行分析代码运行时间平凡方法快捷方法(jupyter环境)二,加速你的查找第5式,用set而非list进行查找低速方法高速方法第6式,用dict而非两个list进行匹配...

weixin_34585343的博客 1490

python pandas for循环_高逼格使用Pandas加速代码,向for循环说拜拜!

原标题:高逼格使用Pandas加速代码,向for循环说拜拜!作者:George Seif编译:公众号翻译部全网进行中···你为什么劝入/劝退Quant?前言使用Pandas dataframe执行数千甚至数百万次计算仍然是一项挑战。你不能简单的将数据丢进去,编写Python for循环,然后希望在合理的时间内处理数据。Pandas是为一次性处理整个行或列的矢量化操作而设计的,循环遍历每个单元格、行...

weixin_39996035的博客 4176

加速 Python for 循环的12个操作

通过对每种方法进行基线测试,包括在 10 次测试运行中执行被测函数 100,000 次循环,然后计算每个循环的平均时间(以纳秒为单位),我们可以清楚地看到改进后的效果。1. 使用列表推导式本文介绍了一系列有效的 Python 优化技巧,这些技巧可以提升 for 循环的性能,从 1.3 倍到 970 倍。这些方法包括:使用列表推导式在外部计算长度使用集合取代嵌套循环跳过不相关的迭代合并代码以减少函数调用避免重复计算使用生成器使用 map() 函数使用记忆化(Memoization)

qq_36807888的博客 1184
上一篇: 关于conda安装包的问题
下一篇: unzip版本问题
yhblog
博客等级 码龄9年 67粉丝 · 111原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值