Python多进程与单进程效率对比

运行环境:Python3 in win10
先生成200个测试文件

# generate.py
i = 0
while i < 200:
    o = open("test\\" + str(i) + ".py", "w")
    content = str(i)
    o.write(content)
    o.close()
    i += 1

多进程拷贝文件

# multi-pool-copy.py
from multiprocessing import Pool, Manager
import time
import os
import shutil
import random

start = time.time()

def copyFile(file_name, old_folder_name, new_folder_name, q):
    time.sleep(random.random())
    shutil.copyfile(old_folder_name + '\\' + file_name, new_folder_name + '\\' + file_name,)
    q.put(file_name)  # put item into the queue

def main():
    pool = Pool(5)
    q = Manager().Queue()

    old_folder_name = input("Please input the folder name you want to copy: ")

    new_folder_name = old_folder_name + "-copy"
    os.mkdir(new_folder_name)

    file_name_list = os.listdir(old_folder_name)

    for file in file_name_list:
        pool.apply_async(copyFile, args=(file, old_folder_name, new_folder_name, q))

    cnt = 0
    allLength = len(file_name_list)
    while cnt < allLength:
        message = q.get()
        cnt += 1
        print("\rCopying %s, Process Bar is:%d%%" % (message, (cnt / allLength) * 100), end="")
    print("Copy Done!")

if __name__ == "__main__":
    main()
    end = time.time()
    print("Time-consuming: %#.2fs" % (end-start))

在使用单进程拷贝文件之前,需要手动删除test-copy文件夹

# single-pool-copy.py
import time
import os
import shutil
import random

start = time.time()

def copyFile(file_name, old_folder_name, new_folder_name):
    time.sleep(random.random())
    shutil.copyfile(old_folder_name + '\\' + file_name, new_folder_name + '\\' + file_name, )

def main():
    old_folder_name = input("Please input the folder name you want to copy: ")

    new_folder_name = old_folder_name + "-copy"
    os.mkdir(new_folder_name)

    file_name_list = os.listdir(old_folder_name)

    cnt = 0
    allLength = len(file_name_list)

    for file in file_name_list:
        copyFile(file, old_folder_name, new_folder_name)
        cnt += 1
        print("\rCopying %s, Process Bar is:%d%%" % (file, (cnt / allLength) * 100), end="")
    print("Copy Done!")

if __name__ == "__main__":
    main()
    end = time.time()
    print("Time-consuming: %#.2fs" % (end-start))

原文地址:https://www.cnblogs.com/sayiqiu/p/10675485.html

时间: 2024-07-31 21:46:00

Python多进程与单进程效率对比的相关文章

Python 多进程、多线程效率比较

Python 界有条不成文的准则: 计算密集型任务适合多进程,IO 密集型任务适合多线程.本篇来作个比较. 通常来说多线程相对于多进程有优势,因为创建一个进程开销比较大,然而因为在 python 中有 GIL 这把大锁的存在,导致执行计算密集型任务时多线程实际只能是单线程.而且由于线程之间切换的开销导致多线程往往比实际的单线程还要慢,所以在 python 中计算密集型任务通常使用多进程,因为各个进程有各自独立的 GIL,互不干扰. 而在 IO 密集型任务中,CPU 时常处于等待状态,操作系统需要

约瑟夫环问题及python与c++实现效率对比

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列. python实现: # 单链表节点 class LinkNode: def __init__( self, value ): self.value = value self.next = None # 创建循环单链表,值从1开始 def create_cycle(

PHP多进程非阻塞模式下结合原生Mysql与单进程效率测试对比

公司在做游戏服务器合并的时候,对大批量数据表做了合并操作,难免会出现数据格式不一致问题.根据玩家反映BUG排查,是因为某个模块下日志表出现了数据格式问题导致. 目前想到的是有两种方案解决,第一种就是把所有的日志表数据修复:第二种就是把程序逻辑修改一下,保证查找格式正确. 我的做法是想把所有数据修复一下,就从线上数据库拿了7000条数据在本地修改测试,保证无误再执行下一步计划. 由于想到数据量会很大,我这里也顺便实验了一下多进程效率和单进程效率的对比.下面看下代码,有很多需要优化的地方....这里

python ,shell 脚本 执行同样操作,花费时间效率对比

废话不说,直接上图(第一个是python写的脚本,第二个和第三个是shell): 文件是一份nginx的log文件,总共583万行,然后是统计各个ip出现次数,各个脚本的执行时间如上所示. 测试环境是:centos 6.5,四核cpu,8g内存. 下面是python脚本 结果是:单核情况下,awk 自增运算最快,python脚本次之,awk和sort等命令的组合最次,猜测awk 是c/c++写的,python解释执行,awk | sort |uniq 的组合,估计哪衔接不好,效率最差. pyth

『Python』MachineLearning机器学习入门_效率对比

效率对比: 老生常谈了,不过这次用了个新的模块, 运行时间测试模块timeti: 1 import timeit 2 3 normal = timeit.timeit('sum(x*x for x in range(1000))', number=10000) 4 native_np = timeit.timeit('sum(na*na)', # 重复部分 5 setup="import numpy as np; na = np.arange(1000)", # setup只运行一次

线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁

线程(from threading import Thread):CPU调度的最小单位 线程的两种创建方式:方式一: 1 from threading import Thread 2 def f1(i): 3 print(i) 4 if __name__ == '__main__': 5 for i in range(10): 6 t = Thread(target=f1,args=(i,)) 7 t.start() 8 print('主线程') 方式二: 1 from threading im

Python 多进程多线编程模板

一.Python 多进程多线程原理介绍 1. Python 全局解释器锁GIL a) Python的全局解释器锁GIL是互斥锁,能够防止本机多个线程一次执行Python字节码:由于CPython的内存管理在线程级别是不安全的(内存泄露),所以这个全局解释器锁是必须的.每个Python进程只能申请使用一个GIL锁,因此Python的多线程虽然是并发的但不能并行处理.Python的解释器每次只能执行一个线程,待GIL锁释放后再执行下一个线程,这样线程轮流被执行. b) Python2.x里,GIL的

Python多进程使用

[Python之旅]第六篇(六):Python多进程使用 香飘叶子 2016-05-10 10:57:50 浏览190 评论0 python 多进程 多进程通信 摘要:   关于进程与线程的对比,下面的解释非常好的说明了这两者的区别:     这里主要说明关于Python多进程的下面几点: 1 2 3 4 5 6 7 1.多进程的使用方法 2.进程间的通信之multiprocessing.Manager()使用 3.Python进程池 ... 关于进程与线程的对比,下面的解释非常好的说明了这两者

Python多进程并发(multiprocessing)用法实例详解

http://www.jb51.net/article/67116.htm 本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Python设计的限制(我说的是咱们常用的CPython).最多只能用满1个CPU核心.Python提供了非常好用的多进程包multiprocessing,你只需要定义一个函数,Python会替你完成其他所有事情.借助这个包,可以轻松完成从单进程到并发执行的转换. 1.新建单一进程 如果我们新建少量进程,