-
发送时要保守,接收时要大方。
——伯斯塔尔定律,又称稳健性法则引自 8.5.7 抽象基类 212
2023-06-05 16:47:57
1人喜欢
回应
-
我坚信,类型提示有存在的必要,然而很多时候得不偿失。用与不用由你自己选择,这多好。
——Guido van Rossum引自 8.8 本章小结 227
-
就像“什么是美”没有确切答案一样,“什么是Python风格”也没有标准答案。因为对你来说是“地道的”,在我看来却可能不是。但我可以肯定的是,“地道”并不是指使用最鲜为人知的语言功能。
如果想计算列表中各个元素的和,那么写出的代码就应该看起来像是在“计算元素之和”。如果不能站在一定高度上表明意图,却让语言去关注底层操作,那还要高级语言干嘛?引自 12.10 延伸阅读 328
-
至于可读性,适当的组合比继承要好。由于读代码的频率比写代码要高得多,因此一般情况下要避免使用子类,特别是不要混合多种类型的继承,也不要使用继承来共享代码。引自 14.9 延伸阅读 395
-
起初,我们推动继承思想是为了让新手顺利使用只能由专家设计的框架开发作品。引自 14.9 延伸阅读 395
-
并发指同时处理多件事。
并行指同时做多件事。
二者不同,但有联系。
一个关于结构,一个关于执行。
并发用于制定方案,用来解决可能(但未必)并行的问题。
——Rob Pike
Go语言联合创造者引自 第 19章 Python并发模型 537
-
1⃣️ 对对象引用计数和解释器其他内部状态的访问受一个锁的控制,这个锁是“全局解释器锁”(Global Interpreter Lock,GIL)。任意时间点上只有一个Python线程可以持有GIL。这意味着,任意时间点上只有一个线程能执行Python代码,与CPU核数量无关。
2⃣️为了防止一个Python线程无限期持有GIL,Python的字节码解释器默认每5毫秒暂停当前Python 线程,释放GIL。被暂停的线程可以再次尝试获得GIL,但是如果有其他线程等待,那么操作系统调度程序可能会从中挑选一个线程开展工作。
3⃣️我们编写的Python代码无法控制GIL。但是,耗时的任务可由内置函数或C语言(以及其他能在Python//CAPI层级接合的语言)扩展释放GIL。
4⃣️Python 标准库中发起系统调用'的函数均可释放GIL。这包括所有执行磁盘IO、网络的函数,以及time.sleep()。NumPy/SciPy库中很多CpU密集型函数,以及zLib和bz2模块中执行压缩和解压操作的函数,也都释放GIL。引自 19.3 术语定义 539
-
我们看到许多团队因为选择了复杂的工具、框架或架构而遇到麻烦,因为他们觉得“可能需要伸缩”。像Twitter和Netflix这样的公司需要支持极端负载,因此需要这些架构,但他们也有非常熟练的开发团队,能够应对由此带来的复杂性。
多数时候,我们并不需要这类工程技术。团队应该克制对Web-Scale的渴望,选择更简单可行的方案。
Web-Scale的关键是一个支持横向伸缩的架构。在这样的架构中,所有系统都是分布式系统,没有任何一门语言能够包揽全部解决方案。引自 19.7.3 服务器端Web和移动开发 561
-
t0=time.perf_counter()
result=func(*args)
elapsed=time.perf_counter()-t0引自 9.8 实现一个简单的装饰器 243
-
Q: dataclass 装饰器是做什么的?
A: 减少创建类的时候的样板代码的。
这个装饰器不关心定义类的时候的类型注解,除了两个:
1⃣️ClassVar伪类型,被注释属性会成为类属性。
2⃣️InitVar伪类型,被注释的属性不会成为实例属性,而是会在__post_init__方法中被调用。引自 5.6 @dataclass详解 135