標簽:python lambda map 參數 ast mem 操作系統 加載 表達
文章目錄
7.1 `List`容量初始化
7.2 元素个数确定时推荐使用Tuple
7.3 推荐使用局部变量引用频繁使用的外界对象
7.4 尽量使用`generator comprehension`代替`listcomprehension`
7.5 使用字符串格式化方式代替"+"和"+="操作符
7.1 List容量初始化
在list成員個數可以預知的情況下,創建list時需預留空間正好容納所有成員的空間
說明:與Java、C++等語言的list一樣,Python語言的list在append()成員時,如果沒有多余的空間容納新的成員,就會分配一塊更大的內存,並將原來內存裏的成員拷貝到新的內存上,並將最新append()的成員也拷貝到此新內存空間中,然後釋放老的內存空間。如果append()調用次數很大,則如上過程會頻繁發生,因而會造成災難性性能下降,而不僅僅是一點下降。
# 错误示例:
members = []
for i in range(1, 1000000):
members.append(i)
len(members)
# 正确示例:
members = [None] * 1000000
for i in range(1, 1000000):
members[i] = i
len(members)
1
2
3
4
5
6
7
8
9
10
7.2 元素个数确定时推荐使用Tuple
在成員個數及內容皆不變的場景下盡量使用tuple替代list
說明:list是動態array,而tuple是靜態array(其成員個數以及內容皆不可變)。因此,list需要更多的內存來跟蹤其成員的狀態。
此外,对于成员个数小于等于20的tuple,Python会对其进行缓存,即当此tuple不再使用时,Python并不会立即将其占用的内存返还给操作系統,而是保留以备后用。
# 错误示例:
myenum = [1, 2, 3, 4, 5]
# 正确示例:
# 如果恰好被缓存过,则初始化速度会为错误示例中的5倍以上。
myenum = (1, 2, 3, 4, 5)
1
2
3
4
5
7.3 推荐使用局部变量引用频繁使用的外界对象
對于頻繁使用的外界對象,盡量使用局部變量來引用之
說明:在Python中對一個函數、變量、模塊的調用,是以一種字典樹的方式來查找的。Python首先會查找locals()數組,這裏保存著所有的局部變量;如果找不到,則會繼續查找globals()數組;如果在這裏也找不到,則會到buildtin(其實是一個模塊)中的locals()數組中查找,或者到其它import進來的模塊/類中查找。
# 错误示例:
import math
def afunc():
for x in range(100000):
return math.tan(x)
# 在这个例子中,Python会先到 globals()中的名值对字典中,找到math模块;
# 然后在math模块的 locals() 的字典中查找 tan() 函数;
# 然后在当前函数的 locals() 中查找 x。这里存在着3次查找。
# 当调用次数大时,每次调用多出来的1、2次查找,就会被放大。
# 错误示例:
from math import tan
def afunc():
for x in range(100000):
return tan(x)
# 在这个例子中,Python会先到 globals() 的字典中查找tan()函数(其已经被from math import tan语句加載到了globals()中);
# 然后在当前函数的locals()中查找x。这里存在着2次查找,比前一个例子少了一次查找,但是还不是最优解。
# 正确示例:
import math
def afunc(tan=math.tan):
for x in range(100000):
return tan(x)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
在這個例子中,在函數定義時,有且只有一次查找math模塊、然後查找tan函數的操作;之後在循環中對tan()函數的調用,都是在afunc()函數的locals()中進行查找,而對函數的locals()中的查找,Python是有特殊優化措施的,速度是非常快的;當然,還包括對本地變量x的查找(也是在當前函數的locals()中查找)。
7.4 尽量使用generator comprehension代替listcomprehension
说明:list comprehension可以用来代替lambda表達式的map、reduce语法,从已有的list中,生成新的数据。而generator comprehension无需定义一个包含yield语句的函数,就可以生成一个generator。 二者一个生成list,另外一个生成generator,在内存的占用上,相差悬殊;在生成速度上,相差无几。
# 错误示例:
even_cnt = len([x for x in range(10) if x % 2 == 0])
# 正确示例:
even_cnt = sum(1 for x in range(10) if x % 2 == 0)
1
2
3
4
7.5 使用字符串格式化方式代替"+“和”+="操作符
使用format方法、"%“操作符和join方法代替”+“和”+="操作符來完成字符串格式化
说明:即使參數都是字符串,也可以使用format方法或%运算符来格式化字符串。一般性能要求的场景可以使用+或+=运算符,但需要避免使用+和+=运算符在循环中累积字符串。由于字符串是不可变的,因此会产生不必要的临时对象并导致二次而非线性运行时间。
# 推荐做法:
x = ‘%s, %s!‘ % (imperative, expletive)
x = ‘{}, {}!‘.format(imperative, expletive)
x = ‘name: %s; score: %d‘ % (name, n)
x = ‘name: {}; score: {}‘.format(name, n)
items = [‘<table>‘]
for last_name, first_name in employee_list:
items.append(‘<tr><td>%s, %s</td></tr>‘ % (last_name, first_name))
items.append(‘</table>‘)
employee_table = ‘‘.join(items)
# 不推荐做法:
x = imperative + ‘, ‘ + expletive + ‘!‘
x = ‘name: ‘ + name + ‘; score: ‘ + str(n)
employee_table = ‘<table>‘
for last_name, first_name in employee_list:
employee_table += ‘<tr><td>%s, %s</td></tr>‘ % (last_name, first_name)
employee_table += ‘</table>‘
————————————————
版权声明:本文为CSDN博主「zhao12501」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文鏈接:https://blog.csdn.net/zhao12501/article/details/115473191
標簽:python lambda map 參數 ast mem 操作系統 加載 表達
原文地址:https://www.cnblogs.com/chengjian-physique/p/14995385.html