小编Don*_*nny的帖子

使用itertools.groupby性能进行Numpy分组

我有许多大型(> 35,000,000)整数列表,它们将包含重复项.我需要计算列表中每个整数的计数.以下代码有效,但似乎很慢.任何人都可以使用Python更好的基准测试,最好是Numpy吗?

def group():
    import numpy as np
    from itertools import groupby
    values = np.array(np.random.randint(0,1<<32,size=35000000),dtype='u4')
    values.sort()
    groups = ((k,len(list(g))) for k,g in groupby(values))
    index = np.fromiter(groups,dtype='u4,u2')

if __name__=='__main__':
    from timeit import Timer
    t = Timer("group()","from __main__ import group")
    print t.timeit(number=1)
Run Code Online (Sandbox Code Playgroud)

返回:

$ python bench.py 
111.377498865
Run Code Online (Sandbox Code Playgroud)

干杯!

根据回复进行编辑:

def group_original():
    import numpy as np
    from itertools import groupby
    values = np.array(np.random.randint(0,1<<32,size=35000000),dtype='u4')
    values.sort()
    groups = ((k,len(list(g))) for k,g in groupby(values))
    index = np.fromiter(groups,dtype='u4,u2')

def group_gnibbler():
    import numpy as np
    from …
Run Code Online (Sandbox Code Playgroud)

python algorithm numpy

26
推荐指数
3
解决办法
2万
查看次数

用于缓冲读取的C++中的python生成器的等效项

Guido Van Rossum在本文中演示了Python的简单性,并利用此函数对未知长度的文件进行缓冲读取:

def intsfromfile(f):
    while True:
        a = array.array('i')
        a.fromstring(f.read(4000))
        if not a:
            break
        for x in a:
            yield x
Run Code Online (Sandbox Code Playgroud)

出于速度原因,我需要在C++中做同样的事情!我有很多文件包含我需要合并的无符号64位整数的排序列表.我找到了用于合并向量的这段代码.

我坚持如何为一个未知长度的文件创建一个ifstream作为一个向量,可以愉快地迭代,直到到达文件的末尾.有什么建议?我用istreambuf_iterator吠叫正确的树吗?

c++ python algorithm io file

3
推荐指数
1
解决办法
605
查看次数

标签 统计

algorithm ×2

python ×2

c++ ×1

file ×1

io ×1

numpy ×1