記一次優化python循環代碼邏輯的過程

問題描述:

一個含有30W元素的列表A,列表的元素都是字符串,現在要循環10W次,每次都要判斷一下B字符串是否存在這個A列表里面,有什么優化策略嗎?

問題現狀:

如果用普通的邏輯來寫, 程序會類似下面:


tl = []
for i in range(300000):
    tl.append(i)

for j in range(100000):
  if k in tl:
    print "hit"

如果像上面的寫法, 程序性能會隨著 10W 這個for循環的增長而幾何級下降。

正確的姿勢

因為python的list本身是屬于不連續的內存, 所以in不停止跳躍各個元素的指針,造成性能的下降。

  • 優化方式1: list轉成dict的key, 然后用dict的in來檢查匹配, 這個方式是因為用in去判斷dict的keys是否存在,首先dict底層的儲存是采用hash儲存,in尋找dict的鍵,本來尋找的對象也是一個生成器,綜合這兩個因素,所以用這種方式性能會大大提升。
  td = dict()
  for i in range(300000):
        td.setdefault(i, None)
  
  for j in range(100000):
        if k in td:
            print "hit"
  
  • 優化方式2: 用numpy的array數據類型,但這個前提是每個元素的數據類型都要一樣,不然array會報錯。因為array本身是一塊連續的大內存,所以循環匹配的時候, 不用跳躍內存尋找,這樣也能大大提高性能。

    import numpy as np
    
    tl = []
    for i in range(300000):
        tl.append(i)
    
  tla = np.array(tl)
    for j in range(100000):
      if k in tla:
          print "hit"
    

至于上面兩種方式的性能對比,有興趣就自己動手試下吧 :)

?

本文鏈接:參與評論 ?

--EOF--

提醒:本文最后更新于 221 天前,文中所描述的信息可能已發生改變,請謹慎使用。

專題「編程語言」的其它文章 ?

Comments

toto足球指数