鱼C论坛

 找回密码
 立即注册
楼主: jerryxjr1220

[作品展示] Python下单线程、多线程、多进程效率比较

[复制链接]
发表于 2017-5-12 16:36:56 From FishC Mobile | 显示全部楼层
也同时增大对内存分配的难度
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-23 19:58:06 | 显示全部楼层
如果您要查看本帖隐藏内容请 回复
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-25 11:51:55 | 显示全部楼层
看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-12-26 08:39:22 | 显示全部楼层
6666666666666666
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-31 18:22:10 | 显示全部楼层
学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-1-31 20:15:52 | 显示全部楼层
就是来学习线程,和进程的,,还没迷糊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-8 12:31:16 | 显示全部楼层
66666666666666666666
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-9 12:32:14 | 显示全部楼层
正好要学这个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-9 17:29:29 | 显示全部楼层
看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-2-9 17:45:59 | 显示全部楼层
本帖最后由 payton24 于 2018-2-9 17:57 编辑
jerryxjr1220 发表于 2017-4-17 12:58
4999999950000000
Multi Threading: Time used: 16.073000 sec


这有点误导观众啊,不能说哪种运行得快就叫多线程啊,支持前面几位的说法。多线程本来就是并发的,在爬虫中运用还是不错的。

最后补充一下,我运行代码的结果为,比单线程还是快那么一点点,可能是现在的编译器优化了吧,用的是python3.6:
  1. 4999999950000000
  2. Multi Threading: Time used: 7.622436 sec
复制代码


代码为:
  1. # Multi Threading
  2. import time
  3. import threading as td

  4. time_start = time.time()

  5. def calc(st, ed):
  6.     global global_list
  7.     tmp = 0
  8.     for i in range(st, ed):
  9.         tmp += i
  10.     global_list.append(tmp)

  11. global_list = []
  12. t1 = td.Thread(target=calc, args=(0, 25000000))
  13. t2 = td.Thread(target=calc, args=(25000000, 50000000))
  14. t3 = td.Thread(target=calc, args=(50000000, 75000000))
  15. t4 = td.Thread(target=calc, args=(75000000, 100000000))
  16. threads = [t1, t2, t3, t4]

  17. for t in threads:
  18.     t.start()
  19. for t in threads:
  20.     t.join()
  21. print (sum(global_list))
  22. time_stop = time.time()
  23. print ('Multi Threading: Time used: %.6f sec' % (time_stop - time_start))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-5 10:21:45 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-5 10:52:14 | 显示全部楼层
payton24 发表于 2018-2-9 17:45
这有点误导观众啊,不能说哪种运行得快就叫多线程啊,支持前面几位的说法。多线程本来就是并发的,在爬 ...

并没有误导啊,其实多线程对于CPU的利用率和单线程的利用率是一样的,但是由于多线程可以并发执行,所以对于频繁读取或者写入操作(文件下载),或者网络请求等待(爬虫)这些操作,多线程是有优势的。
但是对于计算密集型操作(比如大量数据的计算)多线程就和单线程几乎是一样的效率了,这时候就可以利用多进程来处理,多进程是利用多核CPU进行并行计算,所以对CPU的利用会高得多。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-10 17:08:53 | 显示全部楼层
学习一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-10 17:19:12 | 显示全部楼层
这个是在linux还是在win下跑的结果啊。linux的进程线程和win的不同吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-10 17:52:43 | 显示全部楼层
因为Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。
Python虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务。多个Python进程有各自独立的GIL锁,互不影响。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-10 20:41:57 | 显示全部楼层
按时地方官艰苦奋斗时代感就
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-10 21:09:41 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-4-14 21:06:13 | 显示全部楼层
鍥炲
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-14 21:32:20 | 显示全部楼层
回复
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-4-14 21:55:22 From FishC Mobile | 显示全部楼层
学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-29 16:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表