加速使用itertools

时间:2017-03-25 19:43:23

标签: python python-2.7 itertools

我正在尝试解决hackerrank中的Apple和Orange问​​题。

这是我提出的一个解决方案

s,t = raw_input().strip().split(' ')
s,t = [int(s),int(t)]
a,b = raw_input().strip().split(' ')
a,b = [int(a),int(b)]
m,n = raw_input().strip().split(' ')
m,n = [int(m),int(n)]
apple = map(int,raw_input().strip().split(' '))
orange = map(int,raw_input().strip().split(' '))

ap=0
for e in apple:
    d=a+e
    if d>=s and d<=t:
        ap+=1
ora=0
for e in orange:
    d=b+e
    if d>=s and d<=t:
        ora+=1

print ('%d\n%d' %(ap,ora))

我想加快速度。所以我用谷歌搜索了同时迭代两个列表的方法,因此使用itertools这就是我提出的解决方案

s,t = raw_input().strip().split(' ')
s,t = [int(s),int(t)]
a,b = raw_input().strip().split(' ')
a,b = [int(a),int(b)]
m,n = raw_input().strip().split(' ')
m,n = [int(m),int(n)]
apple = map(int,raw_input().strip().split(' '))
orange = map(int,raw_input().strip().split(' '))

ap=ora=0
for i,j in itertools.izip_longest(apple,orange):
    if i is not None:
        d1=a+i
        if d1>=s and d1<=t:
            ap+=1

    if j is not None:
        d2=b+j
        if d2>=s and d2<=t:
            ora+=1

print ('%d\n%d' %(ap,ora))

这是否真的在理论上使代码更快?

1 个答案:

答案 0 :(得分:1)

可能不是。

您已经引入了两个额外的分支,每次循环运行时都必须对其进行测试

if i is not None:

if j is not None:

以及创建生成器对象和解压缩元组的开销。我在这里看到的唯一可能的好处是可能减少需要完成的循环边界检查的数量,但是你必须对它进行基准测试,看看它是否超过了两个if条件。如果两个列表的长度相似,那也只有帮助你的机会。