Python核心技术与实战
景霄
Facebook资深工程师
立即订阅
13891 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 从工程的角度深入理解Python
免费
基础篇 (14讲)
01 | 如何逐步突破,成为Python高手?
02 | Jupyter Notebook为什么是现代Python的必学技术?
03 | 列表和元组,到底用哪一个?
04 | 字典、集合,你真的了解吗?
05 | 深入浅出字符串
06 | Python “黑箱”:输入与输出
07 | 修炼基本功:条件与循环
08 | 异常处理:如何提高程序的稳定性?
09 | 不可或缺的自定义函数
10 | 简约不简单的匿名函数
11 | 面向对象(上):从生活中的类比说起
12 | 面向对象(下):如何实现一个搜索引擎?
13 | 搭建积木:Python 模块化
14 | 答疑(一):列表和元组的内部实现是怎样的?
进阶篇 (11讲)
15 | Python对象的比较、拷贝
16 | 值传递,引用传递or其他,Python里参数是如何传递的?
17 | 强大的装饰器
18 | metaclass,是潘多拉魔盒还是阿拉丁神灯?
19 | 深入理解迭代器和生成器
20 | 揭秘 Python 协程
21 | Python并发编程之Futures
22 | 并发编程之Asyncio
23 | 你真的懂Python GIL(全局解释器锁)吗?
24 | 带你解析 Python 垃圾回收机制
25 | 答疑(二):GIL与多线程是什么关系呢?
规范篇 (7讲)
26 | 活都来不及干了,还有空注意代码风格?!
27 | 学会合理分解代码,提高代码可读性
28 | 如何合理利用assert?
29 | 巧用上下文管理器和With语句精简代码
30 | 真的有必要写单元测试吗?
31 | pdb & cProfile:调试和性能分析的法宝
32 | 答疑(三):如何选择合适的异常处理方式?
量化交易实战篇 (8讲)
33 | 带你初探量化世界
免费
34 | RESTful & Socket: 搭建交易执行层核心
35 | RESTful & Socket: 行情数据对接和抓取
36 | Pandas & Numpy: 策略与回测系统
免费
37 | Kafka & ZMQ:自动化交易流水线
38 | MySQL:日志和数据存储系统
39 | Django:搭建监控平台
40 | 总结:Python中的数据结构与算法全景
技术见闻与分享 (4讲)
41 | 硅谷一线互联网公司的工作体验
42 | 细数技术研发的注意事项
加餐 | 带你上手SWIG:一份清晰好用的SWIG编程实践指南
43 | Q&A:聊一聊职业发展和选择
结束语 (1讲)
结束语 | 技术之外的几点成长建议
Python核心技术与实战
登录|注册

25 | 答疑(二):GIL与多线程是什么关系呢?

景霄 2019-07-05
你好,我是景霄。
不知不觉中,我们又一起完成了第二大章进阶篇的学习。我非常高兴看到很多同学一直在坚持积极地学习,并且留下了很多高质量的留言,值得我们互相思考交流。也有一些同学反复推敲,指出了文章中一些表达不严谨或是不当的地方,我也表示十分感谢。
大部分留言,我都在相对应的文章中回复过了。而一些手机上不方便回复,或是很有价值很典型的问题,我专门摘录了出来,作为今天的答疑内容,集中回复。

问题一:列表 self append 无限嵌套的原理

先来回答第一个问题,两个同学都问到了,下面这段代码中的 x,为什么是无限嵌套的列表?
x = [1]
x.append(x)
x
[1, [...]]
我们可以将上述操作画一个图,便于你更直观地理解:
这里,x 指向一个列表,列表的第一个元素为 1;执行了 append 操作后,第二个元素又反过来指向 x,即指向了 x 所指向的列表,因此形成了一个无限嵌套的循环:[1, [1, [1, [1, …]]]]。
不过,虽然 x 是无限嵌套的列表,但 x.append(x) 的操作,并不会递归遍历其中的每一个元素。它只是扩充了原列表的第二个元素,并将其指向 x,因此不会出现 stack overflow 的问题,自然不会报错。
至于第二点,为什么 len(x) 返回的是 2?我们还是来看 x,虽然它是无限嵌套的列表,但 x 的 top level 只有 2 个元素组成,第一个元素为 1,第二个元素为指向自身的列表,因此 len(x) 返回 2。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Python核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(14)

  • Destroy、
    看到这,终于搞明白多线程和协程的差异,感谢老师。
    2019-07-05
    7
  • cffex是2b
    老师,前次讲的垃圾回收之分代回收,系统默认第二代和第三代阈值为10;对于一个系统来说,这么多全局变量,那么第二代和三代不就在一直很高频的回收?
    2019-07-05
    1
  • 大王叫我来巡山
    第一次完全明白GIL,照顾方便性的同时在实现上偷了懒,但是本身设计就是解决特定问题,而不是解决所有问题的,但是随着受众的增多,是会发展变化,就行脚本语言中引入类型系统,编译型语言中引入类型推断,都是为了语言更好的发展。

    作者回复: 说得很对

    2019-11-29
  • Paul Shan
    我个人认为,线程是CPU调度的最小单元,但是Python,因为GIL的存在让并行无法在线程这个粒度上运行,只好在更大粒度的进程上并行,进程切换的代价比线程大,Python并行的效率低于支持多线程同时在多核上跑的语言。协程是在一个线程内调度资源,无法实现并行,但对IO操作有效,也就是说可以并发利用CPU和IO资源,但是无法并行利用多个CPU资源。我的观点是否正确,请老师指正。
    2019-11-22
  • isaiahqian
    老师,想提供GPU预测的异步接口,这个属于IO密集还是CPU密集?主要计算是使用GPU,不在CPU,而且最后返回结果需要从GPU搬回CPU,应该属于IO操作。所以用多线程更合适?
    2019-09-21
  • 晓冰
    老师你好,python同一时刻只能执行一个线程,那么多核cpu的场景下就没办法充分利用硬件资源,我们在生产环境中是怎么玩的呢?

    作者回复: 实际生产环境都是几万台机子一起运作

    2019-08-15
    1
  • 杰洛特
    请教老师,对于网络请求等待较多的场景,是不是也参考I/O密集型任务,采用多线程好一些?

    作者回复: 嗯嗯

    2019-08-07
  • 贺宇
    在单核单线程的计算机下,是不是任何语言的多线程都是分时间片来操作,也就是所说的伪并行。但是Python的多线程无论在几核计算机下都是单进程在跑,而别的语言的多线程会调用多进程。
    2019-07-17
  • converse✪
    之前不是说io slow的时候用asyncio,heavy的时候用多线程么?为啥这里说heavy用asyncio?
    2019-07-10
  • new
    目前项目不用python看过了似乎是懂了,过一段时间又啥都想不起来了,学习最好的方式是边学边用,可是没机会用。感觉老师确实底蕴深厚呀,好多东西对老师来说似乎很简单,比如图,有向图,有向边,我都不懂呀,感觉差的好多好多

    作者回复: 平时多注重实践,积累,这些都是水到渠成

    2019-07-09
  • 一叶知秋
    感觉问题三非常类似单核cpu的时间片轮转算法
    2019-07-08
  • somenzz
    >>> x = [1]
    >>> y = [1]
    >>> x.append(x)
    >>> x == x
    True
    >>> x == y
    False
    >>> x
    [1, [...]]
    >>> y
    [1]

    第一个同学所说的无限递归问题,我这试了下并未出现,Python 3.7.1
    2019-07-05
    1
  • enjoylearning
    asyncio这是要代替requests的节奏?

    2019-07-05
  • yshan
    继续加油,虽然学习了后面,前面有些已经忘记了,还是需要多复习和实践
    2019-07-05
收起评论
14
返回
顶部