最近在DataCamp上進(jìn)修,對提高python腳本的效率有了更深的理解,并且也學(xué)會(huì)了很多方法。作為一個(gè)非科班已進(jìn)門的小白,我最頭疼的事莫過于取復(fù)雜結(jié)構(gòu)數(shù)據(jù)的時(shí)候要寫多層嵌套循環(huán)去拿data。直覺告訴我這不是一個(gè)高效的方法而且代碼看上去不簡潔,身邊的人也說現(xiàn)在的硬件可以忽略腳本性能,但做科研出身的人是不可能不較真的,為此特意去看了一下這方面的內(nèi)容也剛好碰到這節(jié)網(wǎng)課,以此篇記錄一下所學(xué),提升自己的業(yè)務(wù)代碼,也供其他人參考一下。
0.思路
- 使用更高效的python包代替
for
循環(huán) - 將不需要在循環(huán)中做處理的步驟移到循環(huán)體外
- 用更好的for遍歷方式
1.測量方法
腳本的效率通過腳本運(yùn)行時(shí)間和內(nèi)存資源消耗進(jìn)行衡量
- 如何檢測腳本的效率:用時(shí)間和資源消耗去衡量
- 使用工具(魔法方法)計(jì)算腳本的內(nèi)存和使用時(shí)間:%timeit、line_profiler(%lprun)、memory_profiler (%mprun)
2.使用場景(主要是消除循環(huán))
列表
1.用map遍歷處理list中的值
mylist = ['stress', 'luck', 'lost']
upper_list = list(map(str.upper, mylist))
print(upper_list)
['STRESS', 'LUCK', 'LOST']
2.用set比較列表
1.找出列表中的唯一值(這是set的屬性)
list = [1, 2, 3, 3, 4]
print(set(list))
{1, 2, 3, 4}
2.比較兩個(gè)列表
- 分別是找不同、找相同、并集、交集等
#找出兩個(gè)列表中共有的集合
list_a = ['stress', 'luck', 'lost']
list_b = ['stress', 'luck', 'lost', 'always']
set_a = set(list_a)
set_b = set(list_b)
set_a.intersection(set_b)
#找出補(bǔ)集
set_b.difference(set_a)
{'always'}
#找出并集
set_a.union(set_b)
{'luck', 'lost', 'always', 'stress'}
Dataframe和Array
- 使用列表方法計(jì)算行列式
- numpy進(jìn)行矢量化運(yùn)算
- 盡量不使用
.iloc
的方法,而是使用各種迭代器(itertools):iterrows
、itertuple
、apply
、df.values
等遍歷Dataframe中的值,通過.itertools
進(jìn)行取值。
#列表方法統(tǒng)計(jì)每一行的和
myarray = [[1, 2, 3, 4],
[5, 6, 7, 8],
[2, 5, 6, 7]]
total_sum = [*map(sum, myarray)]
print(total_sum)
[10, 26, 20]
#使用numpy計(jì)算每一行的平均值
myarray_2 = np.array(myarray)
myarray_2_avg = myarray_2.mean(axis=1)
print(myarray_2_avg)
[2.5 6.5 5. ]
#用iterators對Dataframe的行進(jìn)行循環(huán)迭代
for row_tuple in df.itertuples():
print(row_tuple)
Pandas(Index=0, a=1, b=2, c=3, d=4)
Pandas(Index=1, a=5, b=6, c=7, d=8)
Pandas(Index=2, a=2, b=5, c=6, d=7)
#元組可根據(jù)列名進(jìn)行取值
for row_tuple in df.itertuples():
a = row_tuple.a
print(a)
1
5
2
#使用pandas對Dataframe里面行進(jìn)行計(jì)算
df['difference'] = df['example'].values - df['example_2'].values
3.總結(jié)
- 消除不必要的for循環(huán)之后感覺代碼看起來很舒服,減少了不必要的行數(shù)。寫代碼的時(shí)候也不是必須要完全規(guī)避掉
號(hào)外PS: DataCamp的課程是Harvard U進(jìn)駐的課程有興趣的小伙伴可以去看看(絕非廣告,平臺(tái)沒打錢)
參考
DataCamp:Write efficient Python code
FreeCodeCamp
pandas文檔