繁体   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