簡體   English   中英

在Python中從2D數組中選擇列的最快方法?

[英]Fastest way to select column from 2D array in Python?

我正在嘗試提高計算Python中2D數組的列中某個元素的出現次數的函數的性能。 時間來自cProfile,這也告訴我count()每357595個調用僅占用〜.08s。

for循環最快(357595個調用為.375秒):

def count_column(grid, j, element):
    count = 0
    for x in range(0, len(grid)):
        if grid[x][j] == element:
            count += 1
    return count

列表理解的速度可以忽略不計(357595個呼叫為.400s):

def count_column(grid, j, element):
    return [x[j] for x in grid].count(element)

郵編是最慢的,幅度極大(357595個呼叫為.741秒):

def validate_column(grid, j, element):
    return zip(*grid)[j].count(element)

有沒有更快的方法可以做到這一點,或者最好的方法是使用chain.from_iterable來使數組變平?

這是我獲得一系列不同變體的時間:

cc_explicit 5000 0.00290012359619
cc_explicit_xrange 5000 0.00145506858826
cc_filter 5000 0.00117516517639
cc_genexp 5000 0.00100994110107
cc_ifilter 5000 0.00170707702637
cc_izip 1 3.21103000641
cc_listcomp 5000 0.000788927078247
cc_zip 5000 12.1080589294

代碼和測試驅動程序位於http://pastebin.com/WSAUqTyv

由於zip和izip太慢了,因此我將它們排除在等式之外,並使用其余代碼進行了500000x10測試:

cc_explicit 500000 0.105982065201
cc_explicit_xrange 500000 0.103507995605
cc_filter 500000 0.0856108665466
cc_genexp 500000 0.0679898262024
cc_ifilter 500000 0.144966125488
cc_listcomp 500000 0.0396680831909

因此,最快的解決方案是listcomp 但是,當我將隨機數據和較大的行扔給它時, genexpexplicit_xrange有時都擊敗了listcomp ,並且在大多數測試中它們都非常接近,並且genexp使用的內存要少得多,所以我genexp

def cc_genexp(grid, j, element):
    return sum(x[j] == element for x in grid)

如果我可以在這里提供兩美分,您也應該像建議的那樣研究Numpy 或者,如果您不想處理非標准庫,則應簽出collections.Counter() 是的,它具有很高的前期成本,但是如果您發現自己對同一數據集中的許多不同值進行計數,則可能會發現初始投資會有所回報。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM