python 的多线程执行速度

python 的多线程有点鸡肋,适用场景有局限,单位时间多个核只能跑一个线程。

有泳池一个,四个泵,但只有一个人,一人只能开启管理着其中一个,所以四个泵没什么用。但是,如果泵的工作时间与冷却恢复时间是1:3(感谢inoahx指出,已改),那么配置的利用率高达100%。

直接运行代码

single.py

#!/usr/bin/python3
#-*- coding: utf-8 -*-
# author:zhouchao
# 功能:直接运行程序 计算时间

import threading
import sys
import math
import time

lists = [];
for x in range(1,10000000):
    lists.append(x);

length = len(lists);
for x in range(600):
    step = math.ceil(float(length)/600)
    minIndex = step * x
    if minIndex + step > length :
        maxIndex = length
    else:
        maxIndex = minIndex+step

    print(lists[minIndex:maxIndex])
    datetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    fileObject = open("time1.txt",‘a+‘);
    fileObject.write(str(datetime)+"\n");
    fileObject.close();

所需时间:134 s

开600 个线程运行同一代码

multiThread.py

#!/usr/bin/python3
#-*- coding: utf-8 -*-
# author:zhouchao
# 功能:600线程计算执行时间

import threading
import sys
import math
import time

lists = [];
for x in range(1,10000000):
    lists.append(x);

def function(i):
    global lists
    length = len(lists);
    step = math.ceil(float(length)/600)
    minIndex = step * i
    if minIndex + step > length :
        maxIndex = length
    else:
        maxIndex = minIndex+step

    print(lists[minIndex:maxIndex])
    datetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    # datetime = str(lists[minIndex:maxIndex])
    fileObject = open("time2.txt",‘a+‘);
    fileObject.write(str(datetime)+"\n");
    fileObject.close();

threads = []
for i in range(600):
    t = threading.Thread(target=function , args=(i,))
    threads.append(t)
    t.start()
    t.join()

所需时间:160 s

原文地址:https://www.cnblogs.com/zc123/p/8469003.html

时间: 2024-11-09 06:10:32

python 的多线程执行速度的相关文章

python之多线程执行和非线程执行的对比

一.非线程执行(普通的执行) 1.非线程运行,简单代码如下 #_*_coding:utf-8_*_ import time import threading a = [] b = [] def func1():     print "func1 start %s" % time.ctime()     alist = ["192.168.1.100","192.168.1.120","192.168.1.134","

python paramiko 多线程

Python paramiko多线程执行命令的脚本,加入了threading多线程,执行起来感觉效率很一般,有时候线程还会等待延迟. 据说别人测试的数据,Python多线程中每个时刻只有1个线程运行,每个逻辑CPU利用率都很低,只是有时候换换CPU运行.虽然不知道别人怎么观察的,不过执行起来确实慢,耗资源也比单线程高很多. #!/usr/bin/python # -*- coding: utf-8 -*- import paramiko,threading,sys class SSH_cmd(t

单线程和多线程执行对比—Python多线程编程

单线程和多线程执行对比 本章使用递归求斐波那契.阶乘与累加函数的执行来对比单线程与多线程: 斐波那契.阶乘与累加(mtfacfib.py): ? 1 import threading 2 from time import sleep, ctime 3 ? 4 class MyThread(threading.Thread): 5 def __init__(self, func, args, name=''): 6 threading.Thread.__init__(self) 7 self.na

python基础---多线程

多线程 1 线程: 线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程,车间负责把资源整合到一起,是一个资源单位,而一个车间内至少有一个流水线 进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位 多线程: 多线程(即多个控制线程)的概念是,在一个进程中存在多个控制线程,多个控制线程共享该进程的地址空间,相当于一个车间内有多条流水线,都共用一个车间的资源 1. 多线程共享一个进程的地址空间 2. 线程比进

Python的多线程GIL浅谈

来源知乎:https://www.zhihu.com/question/23474039/answer/269526476 在介绍Python中的线程之前,先明确一个问题,Python中的多线程是假的多线程! 为什么这么说,我们先明确一个概念,全局解释器锁(GIL).Python代码的执行由Python虚拟机(解释器)来控制.Python在设计之初就考虑要在主循环中,同时只有一个线程在执行,就像单CPU的系统中运行多个进程那样,内存中可以存放多个程序,但任意时刻,只有一个程序在CPU中运行.同样

多线程执行测试用例二

计算密集型 vs. IO密集型 计算密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率.对视频进行高清解码等等,全靠CPU的运算能力.这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数.对于计算密集型任务,最好用运行效率高的C语言编写.也可使用python多进程,充分利用多cpu. 涉及到网络.磁盘IO的任务都是IO密集型任务,这类任务的特点是

python中多线程(1)

一多线程的概念介绍 threading模块介绍 threading模块和multiprocessing模块在使用层面,有很大的相似性. 二.开启多线程的两种方式 1.创建线程的开销比创建进程的开销小,因而创建线程的速度快 2 from multiprocessing import Process 3 from threading import Thread 4 import os 5 import time 6 def work(): 7 print('<%s> is running'%os.

为什么python的多线程不能利用多核CPU?

为什么python的多线程不能利用多核CPU,但是咱们在写代码的时候,多线程的确是在并发,而且还比单线程快. 一.python的多线程不能利用多核CPU? 原因: 因为GIL,python只有一个GIL,运行python时,就要拿到这个锁才能执行,在遇到I/O 操作时会释放这把锁. 如果是纯计算的程序,没有 I/O 操作,解释器会每隔100次操作就释放这把锁,让别的线程有机会 执行(这个次数可以通sys.setcheckinterval 来调整)同一时间只会有一个获得GIL线程在跑,其他线程都处

Python实现多线程HTTP下载器

本文将介绍使用Python编写多线程HTTP下载器,并生成.exe可执行文件. 环境:windows/Linux + Python2.7.x 单线程 在介绍多线程之前首先介绍单线程.编写单线程的思路为: 解析url: 连接web服务器: 构造http请求包: 下载文件. 接下来通过代码进行说明. 解析url 通过用户输入url进行解析.如果解析的路径为空,则赋值为'/':如果端口号为空,则赋值为"80":下载文件的文件名可根据用户的意愿进行更改(输入'y'表示更改,输入其它表示不需要更