加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

编程大神进阶之路:Python能力小贴士

发布时间:2019-10-24 13:37:22 所属栏目:建站 来源:机器之心编译
导读:先容 Python 炫酷成果(譬喻,变量解包,偏函数,列举可迭代工具等)的文章层出不穷。可是尚有许多 Python 的编程小能力鲜被说起。因此,本文会试着先容一些其余文章没有提到的小能力,这些小能力也是我平常会用到的的。让我们一探毕竟吧! 清算字符串输入 整

假如你曾经编写过一个建设了某种类的大量实例的措施,那么你也许已经留意到,你的措施溘然必要大量的内存。那是由于 Python 行使字典来暗示类实例的属性,这使其速率很快,但内存行使服从却不是很高。凡是环境下,这并不是一个严峻的题目。可是,假如你的措施因此受到严峻的影响,不妨试一下「__slots__」:

  1. class Person: 
  2.     __slots__ = ["first_name", "last_name", "phone"] 
  3.     def __init__(self, first_name, last_name, phone): 
  4.         self.first_name = first_name 
  5.         self.last_name = last_name 
  6.         self.phone = phone 

当我们界说了「__slots__」属性时,Python 没有行使字典来暗示属性,而是行使小的牢靠巨细的数组,这大大镌汰了每个实例所需的内存。行使「__slots__」也有一些弱点:我们不能声明任何新的属性,我们只能行使「__slots__」上现有的属性。并且,带有「__slots__」的类不能行使多重担任。

限定「CPU」和内存行使量

假如不是想优化措施对内存或 CPU 的行使率,而是想直接将其限定为某个确定的数字,Python 也有一个对应的库可以做到:

  1. import signal 
  2. import resource 
  3. import os 
  4.  
  5. # To Limit CPU time 
  6. def time_exceeded(signo, frame): 
  7.     print("CPU exceeded...") 
  8.     raise SystemExit(1) 
  9.  
  10. def set_max_runtime(seconds): 
  11.     # Install the signal handler and set a resource limit 
  12.     soft, hard = resource.getrlimit(resource.RLIMIT_CPU) 
  13.     resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard)) 
  14.     signal.signal(signal.SIGXCPU, time_exceeded) 
  15.  
  16. # To limit memory usage 
  17. def set_max_memory(size): 
  18.     soft, hard = resource.getrlimit(resource.RLIMIT_AS) 
  19.     resource.setrlimit(resource.RLIMIT_AS, (size, hard)) 

我们可以看到,在上面的代码片断中,同时包括配置最大 CPU 运行时刻和最大内存行使限定的选项。在限定 CPU 的运行时刻时,我们起首得到该特定资源(RLIMIT_CPU)的软限定和硬限定,然后行使通过参数指定的秒数和先前检索到的硬限定来举办配置。最后,假如 CPU 的运行时刻高出了限定,我们将发出体系退出的信号。在内存行使方面,我们再次检索软限定和硬限定,并行使带「size」参数的「setrlimit」和先前检索到的硬限定来配置它。

节制可以/不行以导入什么

有些说话有很是明明的机制来导出成员(变量、要领、接口),譬喻在 Golang 中只有以大写字母开头的成员被导出。然而,在 Python 中,全部成员城市被导出(除非我们行使了「__all__」):

  1. def foo(): 
  2.     pass 
  3.  
  4. def bar(): 
  5.     pass 
  6.  
  7. __all__ = ["bar"] 

在上面这段代码中,我们知道只有「bar」函数被导出了。同样,我们可以让「__all__」为空,这样就不会导出任何对象,当从这个模块导入的时辰,会造成「AttributeError」。

实现较量运算符的简朴要领

为一个类实现全部的较量运算符(如 __lt__ , __le__ , __gt__ , __ge__)是很繁琐的。有更简朴的要领可以做到这一点吗?这种时辰,「functools.total_ordering」就是一个很好的协助:

  1. from functools import total_ordering 
  2.  
  3. @total_ordering 
  4. class Number: 
  5.     def __init__(self, value): 
  6.         self.value = value 
  7.  
  8.     def __lt__(self, other): 
  9.         return self.value < other.value 
  10.  
  11.     def __eq__(self, other): 
  12.         return self.value == other.value 
  13.  
  14. print(Number(20) > Number(3)) 
  15. print(Number(1) < Number(5)) 
  16. print(Number(15) >= Number(15)) 
  17. print(Number(10) <= Number(2)) 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读