区块链技术博客
www.b2bchain.cn

使用itertools.groupby性能进行numpy分组 – python程序员分享

D0b2wT.gif

本文介绍了使用itertools.groupby性能进行numpy分组 – python程序员分享,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

我有很多大的(> 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) 

返回:

$ python bench.py  111.377498865 

干杯!

根据响应编辑:

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 itertools import groupby     values = np.array(np.random.randint(0,1<<32,size=35000000),dtype='u4')     values.sort()     groups = ((k,sum(1 for i in g)) for k,g in groupby(values))     index = np.fromiter(groups,dtype='u4,u2')  def group_christophe():     import numpy as np     values = np.array(np.random.randint(0,1<<32,size=35000000),dtype='u4')     values.sort()     counts=values.searchsorted(values, side='right') - values.searchsorted(values, side='left')     index = np.zeros(len(values),dtype='u4,u2')     index['f0']=values     index['f1']=counts     #Erroneous result!  def group_paul():     import numpy as np     values = np.array(np.random.randint(0,1<<32,size=35000000),dtype='u4')     values.sort()     diff = np.concatenate(([1],np.diff(values)))     idx = np.concatenate((np.where(diff)[0],[len(values)]))     index = np.empty(len(idx)-1,dtype='u4,u2')     index['f0']=values[idx[:-1]]     index['f1']=np.diff(idx)  if __name__=='__main__':     from timeit import Timer     timings=[                 ("group_original","Original"),                 ("group_gnibbler","Gnibbler"),                 ("group_christophe","Christophe"),                 ("group_paul","Paul"),             ]     for method,title in timings:         t = Timer("%s()"%method,"from __main__ import %s"%method)         print "%s: %s secs"%(title,t.timeit(number=1)) 

返回:

$ python bench.py  Original: 113.385262966 secs Gnibbler: 71.7464978695 secs Christophe: 27.1690568924 secs Paul: 9.06268405914 secs 

尽管Christophe目前给出的结果不正确

参考方案

我做类似这样的事情得到了3倍的改进:

def group():     import numpy as np     values = np.array(np.random.randint(0,3298,size=35000000),dtype='u4')     values.sort()     dif = np.ones(values.shape,values.dtype)     dif[1:] = np.diff(values)     idx = np.where(dif>0)     vals = values[idx]     count = np.diff(idx) 

单行的'if'/'for'语句是否使用Python样式好? – python

我经常在这里看到某人的代码,看起来像是“单线”,这是一条单行语句,以传统的“if”语句或“for”循环的标准方式执行。我在Google周围搜索,无法真正找到可以执行的搜索类型?任何人都可以提出建议并最好举一些例子吗?例如,我可以一行执行此操作吗?example = "example" if "exam" in exam…

为什么使用'=='或'is'比较字符串有时会产生不同的结果? – python

我有一个Python程序,其中将两个变量设置为'public'值。在条件表达式中,我有比较var1 is var2失败,但如果将其更改为var1 == var2,它将返回True。现在,如果我打开Python解释器并进行相同的“是”比较,则此操作成功。>>> s1 = 'public' >&gt…

在返回'Response'(Python)中传递多个参数 – python

我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)… python文件:def get(request): … return Response(seriali…

Python exchangelib在子文件夹中读取邮件 – python

我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…

如何修复AttributeError:模块'numpy'没有属性'square' – python

Improve this question 我已经将numpy更新为1.14.0。我使用Windows10。我尝试运行我的代码,但出现此错误: AttributeError:模块“ numpy”没有属性“ square”这是我的进口商品:%matplotlib inline import matplotlib.pyplot as plt import ten…

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 使用itertools.groupby性能进行numpy分组 – python程序员分享
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们