生信log31|讓Python代碼高效(消除循環)的方法總結

最近在DataCamp上進修,對提高python腳本的效率有了更深的理解,并且也學會了很多方法。作為一個非科班已進門的小白,我最頭疼的事莫過于取復雜結構數據的時候要寫多層嵌套循環去拿data。直覺告訴我這不是一個高效的方法而且代碼看上去不簡潔,身邊的人也說現在的硬件可以忽略腳本性能,但做科研出身的人是不可能不較真的,為此特意去看了一下這方面的內容也剛好碰到這節網課,以此篇記錄一下所學,提升自己的業務代碼,也供其他人參考一下。

0.思路

  • 使用更高效的python包代替for循環
  • 將不需要在循環中做處理的步驟移到循環體外
  • 用更好的for遍歷方式

1.測量方法

腳本的效率通過腳本運行時間和內存資源消耗進行衡量

  • 如何檢測腳本的效率:用時間和資源消耗去衡量
  • 使用工具(魔法方法)計算腳本的內存和使用時間:%timeit、line_profiler(%lprun)、memory_profiler (%mprun)

2.使用場景(主要是消除循環)

列表
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.比較兩個列表

  • 分別是找不同、找相同、并集、交集等
#找出兩個列表中共有的集合
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)

#找出補集
set_b.difference(set_a)
{'always'}

#找出并集
set_a.union(set_b)
{'luck', 'lost', 'always', 'stress'}

Dataframe和Array

  1. 使用列表方法計算行列式
  2. numpy進行矢量化運算
  3. 盡量不使用 .iloc的方法,而是使用各種迭代器(itertools):iterrowsitertupleapplydf.values等遍歷Dataframe中的值,通過.itertools進行取值。
#列表方法統計每一行的和
 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計算每一行的平均值
myarray_2 = np.array(myarray)
myarray_2_avg = myarray_2.mean(axis=1)
print(myarray_2_avg)
[2.5 6.5 5. ]

#用iterators對Dataframe的行進行循環迭代
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)

#元組可根據列名進行取值
for row_tuple in df.itertuples():
     a = row_tuple.a
     print(a)

1
5
2

#使用pandas對Dataframe里面行進行計算
df['difference'] = df['example'].values - df['example_2'].values

3.總結

  • 消除不必要的for循環之后感覺代碼看起來很舒服,減少了不必要的行數。寫代碼的時候也不是必須要完全規避掉

號外PS: DataCamp的課程是Harvard U進駐的課程有興趣的小伙伴可以去看看(絕非廣告,平臺沒打錢)


參考
DataCamp:Write efficient Python code
FreeCodeCamp
pandas文檔

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容