python – 使用itertools.combinations的最快方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 使用itertools.combinations的最快方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3118字,纯文字阅读大概需要5分钟。
内容图文
![python – 使用itertools.combinations的最快方法](/upload/InfoBanner/zyjiaocheng/724/fd53994a84f64635b47784e604c8afe3.jpg)
我需要加快下面的功能:
import numpy as np
import itertools
import timeit
def combcol(myarr):
ndims = myarr.shape[0]
solutions = []
for idx1, idx2, idx3, idx4, idx5, idx6 in itertools.combinations(np.arange(ndims), 6):
c1, c2, c3, c4, c5, c6 = myarr[idx1,1], myarr[idx2,2], myarr[idx3,1], myarr[idx4,2], myarr[idx5,1], myarr[idx6,2]
if c1-c2>0 and c2-c3<0 and c3-c4>0 and c4-c5<0 and c5-c6>0 :
solutions.append(((idx1, idx2, idx3, idx4, idx5, idx6),(c1, c2, c3, c4, c5, c6)))
return solutions
X = np.random.random((20, 10))
Y = np.random.random((40, 10))
if __name__=='__main__':
from timeit import Timer
t = Timer(lambda : combcol(X))
t1 = Timer(lambda : combcol(Y))
print('t : ',t.timeit(number=1),'t1 : ',t1.timeit(number=1))
结果:
t : 0.6165180211451455 t1 : 64.49216925614847
该算法对于我的标准使用来说太慢了(myarr.shape [0] = 500).
是否有NumPy方法来减少此功能的执行时间(不浪费太多内存)?
是否可以在Cython中实现该问题?
我已经尝试使用cProfile查看哪些部分很慢.
这里的大部分时间都花在调用combcol()上.
import profile
........
........
profile.run('print(len(combcol(Y))); print')
144547
144559 function calls in 39.672 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
144547 0.641 0.000 0.641 0.000 :0(append)
1 0.000 0.000 0.000 0.000 :0(arange)
2 0.000 0.000 0.000 0.000 :0(charmap_encode)
1 0.000 0.000 39.672 39.672 :0(exec)
1 0.000 0.000 0.000 0.000 :0(len)
1 0.000 0.000 0.000 0.000 :0(print)
1 0.000 0.000 0.000 0.000 :0(setprofile)
1 0.094 0.094 39.672 39.672 <string>:1(<module>)
2 0.000 0.000 0.000 0.000 cp850.py:18(encode)
1 38.938 38.938 39.578 39.578 essaiNumpy4.py:13(combcol)
1 0.000 0.000 39.672 39.672 profile:0(print(len(combcol(Y))); print)
0 0.000 0.000 profile:0(profiler)
最后我修改了这样的代码:
def combcol2(myarr):
ndims = myarr.shape[0]
myarr1 = myarr[:,1].tolist()
myarr2 = myarr[:,2].tolist()
solutions = []
for idx1, idx2, idx3, idx4, idx5, idx6 in itertools.combinations(range(ndims), 6):
if myarr1[idx1] > myarr2[idx2] < myarr1[idx3] > myarr2[idx4] < myarr1[idx5] > myarr2[idx6]:
solutions.append(((idx1, idx2, idx3, idx4, idx5, idx6),(myarr1[idx1], myarr2[idx2], myarr1[idx3], myarr2[idx4], myarr1[idx5], myarr2[idx6])))
return solutions
X = np.random.random((40, 10))
if __name__=='__main__':
from timeit import Timer
t = Timer(lambda : combcol2(X))
print('t : ',t.timeit(number=1))
结果:
t : 4.341582240200919
解决方法:
alko已经为你的计划列出了有用的改革,Tim Peters指出500-choose-6超过21万亿(即21057686727000).这个答案将指出原始程序的简单加速. (我认为与alko的方法相比,这是一个小的加速,但以下值得注意未来的python编程.)
你的选择陈述是
如果c1-c2> 0且c2-c3 <0且c3-c4> 0且c4-c5 <0且c5-c6> 0:
这相当于
如果c1> c2且c2< c3和c3> c4且c4< c5和c5> c6:
但在python解释器中,前者比后者长67%.例如,以下是两个案例的一些示例输出,在我的Intel i3-2120机器上(显然比你的机器快几倍)运行Python 2.7.5:
(‘t:’,0.12977099418640137,’t1:’,14.45378589630127)
(‘t:’,0.0887291431427002,’t1:’,8.54729700088501)
4次此类运行的平均比率为14.529 / 8.709 = 1.668.
内容总结
以上是互联网集市为您收集整理的python – 使用itertools.combinations的最快方法全部内容,希望文章能够帮你解决python – 使用itertools.combinations的最快方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。