如何改善python代码的运行时间

时间:2016-09-19 23:04:44

标签: python performance for-loop runtime

我正试图从在线编码网站解决以下问题。

问题: 弗雷多很擅长处理大数据。所以,一旦他的朋友宙斯给了他一系列N个数字,然后是他必须回答的Q查询。在每个查询中,他定义了查询的类型以及Fredo必须回答的数字f。每个查询都有以下两种类型: 类型0:对于此查询,Fredo必须回答数组中的第一个数字(从索引0开始),使其频率至少等于f。 类型1:对于此查询,Fredo必须回答数组中的第一个数字,使得频率恰好等于f。 现在,Fredo回答了他所有的疑问,但现在Zeus想象他应该如何验证它们。所以,他要求你写一个相同的代码。 注意:如果没有数字作为查询的答案,则输出0。 使用快速I / O.

输入: 输入的第一行包含N,即数组的大小 下一行包含N个空格分隔的整数。 下一行包含Q,表示查询的数量。 然后按照Q行,每行有两个整数类型和f,表示查询的类型和你必须回答查询的频率。

输出: 您必须在单独的行中打印每个查询的答案。

输入约束:

1≤N≤106

1≤A[I]≤1018

1≤Q≤106

0≤type≤1

1≤f≤1018

示例输入

6

1 2 2 1 2 3

5

0 1

0 2

1 2

1 3

0 3

示例输出

1

1

1

2

2

解决方案: 这是我尝试过的解决方案

from collections import Counter
import sys
tokenizedInput = sys.stdin.read().split()
t = int(tokenizedInput[0])
a = []
for i in range(t):
    s = int(tokenizedInput[i+1])
    a.append(s)
collection = Counter(a)
key = collection.keys()
value = collection.values()
q = int(tokenizedInput[i+2])
k = i+2
for j in range(q):
    query = int(tokenizedInput[k+2*j+1])
    f = int(tokenizedInput[k+2*j+2])
    for w in range(t):
        index = key.index(a[w])
        if query == 0:
            if value[index] >= f:
                print a[w]
                break
        else:
            if value[index] == f:
                print a[w]
                break
        if w == t-1:
            print 0

此代码正常运行并为较小的测试用例提供正确的输出,但超过了较大测试用例的时间限制。有人可以建议可以对此代码进行哪些改进以提高速度。

1 个答案:

答案 0 :(得分:0)

一些建议:完成int()的{​​{1}}转换,而不是在循环中反复调用tokenizedInput;像int()这样的字典非常有效,不要通过提取密钥和值来猜测它,按照预期使用它;在循环之前预先计算任何你能做的事情;简化,简化,简化。

我已根据上述建议重新编写代码,加上其他调整,看看它是否对您有意义,并在限定时间内执行:

collection

大多数人都会使用单独的read语句来处理它,以输入各种标量和数组值。你选择在开头的一次阅读中做到这一点,这很好,但你必须注意你的设计,以便最初的选择不会妨碍你。