需要减少python 3代码中大型输出的执行时间

时间:2017-04-14 08:43:43

标签: python python-3.x

这是一个程序,它具有输入数组中元素数量的第一个输入,第二个输入是输入数组,第三个输入是要在列表中计数的数字

num = int(input())
array = input()
lissst = array.split() 
lissst = [int(a) for a in lissst]
num_query = int(input())
i = num_query
while i > 0:
    queries = int(input())
    x = lissst.count(queries)
    if x > 0:
        print (x) 
    elif x == 0:
        print("NOT PRESENT")
    i = i - 1

输入格式如下所示:

6

1 1 1 2 2 0

6 1

2

1

0

3

4

输出布局如下:

3

2

3

1

不存在

不存在

我需要减少大输入的执行时间,有关如何解决此特定问题的任何提示吗?

3 个答案:

答案 0 :(得分:0)

更快地回答查询号码,可以建立数字的字典映射 - >计数。

接收查询号时,使用字典映射返回O(1)摊销的结果(而不是原始天真解决方案的O(n))

构建地图 O(n)

num2count = {}
for i in my_array:
    if not i in num2count:
        num2count[i] = 1
    else:
        num2count[i] += 1

回答一个问题"数组中x的次数" O(1)平均

counts = num2count.get(x, 0)

您的代码已更新

num = int(input())
array = input()
lissst = array.split() 
lissst = [int(a) for a in lissst]

num2count = {}
for i in lissst:
    if not i in num2count:
        num2count[i] = 1
    else:
        num2count[i] += 1

num_query = int(input())
i = num_query
while i > 0:
    queries = int(input())
    x = num2count.get(queries, 0)
    if x > 0:
        print (x) 
    elif x == 0:
        print("NOT PRESENT")
    i = i - 1

答案 1 :(得分:0)

缓慢可能来自这里:

x = lissst.count(queries)

因为list.count每次都必须阅读整个列表。

您可以通过将输入数组中的每个数字放入字典中来加快速度(数字 - >它出现在数组中的频率)。下面我使用collections.Counter,它只是一个方便的dicts包装器:

from collections import Counter

num = int(input())

array = input()
array = [int(a) for a in array.split()]
counter = Counter(array)

i = int(input())

while i > 0:
    query = int(input())
    x = counter[query]
    if x > 0:
        print (x) 
    else:
        print("NOT PRESENT")
    i -= 1

答案 2 :(得分:0)

除现有答案外,您还可以尝试Pypy:https://pypy.org

“如果你希望你的代码运行得更快,你应该只使用PyPy。” - Guido van Rossum(Python的创建者)