Python 板


LINE

※ 引述《sariel0322 (sariel)》之銘言: : 我想要請問一下,如果我有一串數字 : A = [9,5,5,4,7,6,4,1,2,0,10,9,7,....] : 要如何找出這列資料中只出現一次的數字,但不用到for迴圈的方法 (冏冏,我看成有出現就好…… 明天再補了 > <) 完整檔案見 IPython Notebook http://nbviewer.ipython.org/gist/ccwang002/bc1b047d0eca2c8f8bdd 這真的要快的話,就不應該自己寫 for loop,所以我想得到最快的方法就是用 set(A) 但有沒有更快的方式呢?其中一個可能是用 Cython, cffi 自己刻一個, 但 numpy.unique() 不知道快不快? 直覺上以為是會快很多的,所以來個實測。 # Test by IPython on Python 3.4 import numpy as np LEN = 10**7 # 約需要總共 200MB 的記憶體 # 整數 A = np.random.randint(0, 100, LEN) # numpy 陣列 (ndarray) A_list = A.tolist() # 一般的 list %timeit -n 5 np.unique(A) # numpy 解法 %timeit -n 5 set(A_list) # set() 解法 %timeit set(A) # 混用,對 numpy 陣列用 set() # 448ms, 232ms, 1.67s # 5.18s, 2.31s, - s if LEN = 10**8 結果 set() 跑得比 np.unique() 還快,蠻驚訝的 > < 資料量調大仍舊相同的趨勢。 混用很可怕,這小測試暗示 ndarray 用內建函式的時候,很可能會做非常多轉換, 很容易拖慢速度。而內建的指令其實速度飛快。 但這樣 numpy 哪裡有優勢,是否該洗洗睡?我猜它在浮點數表現就會好很多, 浮點數找相同的數值有點怪,但總之要幫 numpy 平反也不管這麼多了xd # 浮點數版本,只會有 0.0, 0.1, 0.2, ... A = np.random.randint(0, 100, LEN) / 10 A_list = A.tolist() %timeit -n 5 np.unique(A) %timeit -n 5 set(A_list) %timeit -n 5 set(A) # 698ms, 1.55s, 2.23s 果然 numpy 的效率就好很多。 恩…總之蠻好玩的。 PS Py 3.4 中多了 tracemalloc module 可以追蹤程式執行間記憶體用量 https://docs.python.org/3/library/tracemalloc.html 看 Python 物件記憶體用量(?) 可用 sys.getsizeof(obj) 看 Numpy .............. 可用 ndarray_obj.nbytes -- PyCon APAC 2014/TW is coming! May 17-18 @中研院人社館 More info on https://tw.pycon.org/2014apac/zh/ --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.217.22
※ 文章網址: http://webptt.com/m.aspx?n=bbs/Python/M.1399836156.A.6F6.html
1F:推 timTan:讚 05/12 11:09
2F:推 apua:關於記憶體用量, 筆記中有些地方我不懂 05/12 11:22
3F:→ apua:為什麼用 numpy 做出 A 之後, 記憶體用量還不大; 做出 A.list 05/12 11:23
4F:→ apua:之後, A.nbytes 就隨之暴增了? A.nbytes 是 A 物件的大小對嗎 05/12 11:24
5F:→ apua:所以可以理解成 A (numpy obj) 會在被操作時多做些事情? 05/12 11:24
喔喔,我的猜測是 tracemalloc 它是在 python 分配記憶體的時候多加一個 hook 來記錄每行程式記憶體的增減,但 numpy 在 malloc 的時候不是用 python 的版本 所以 tracemalloc 裡會看不到 A (numpy obj) 的大小。 如果要看的話就要使用 numpy API 的 A.nbytes。 不過這個問題可能在 Py 3.5 + numpy 1.9(2.0?) 就會被解決了,python mail list 已經在討論相關的可行性 http://bugs.python.org/issue21233 http://mail.scipy.org/pipermail/numpy-discussion/2014-April/069935.html 但我蠻意外的是兩者的大小竟然差不多 我以為 numpy 的實作記憶體用量會小 list 的不少,是不是我搞錯什麼了 @@
6F:→ ya790206:python set 的實作是用 C 寫的,使用 hash 演算法 05/12 21:30
7F:→ ya790206:python list 所佔用的記憶體大小是 header + 05/12 21:30
8F:→ ya790206:指標大小*預留空間大小,所以也不算太佔空間 05/12 21:31
感謝分享! ※ 編輯: ccwang002 (140.112.129.20), 05/14/2014 11:34:06







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP