首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何优化python代码(运行时间应小于10s)?

如何优化python代码(运行时间应小于10s)?
EN

Stack Overflow用户
提问于 2016-06-05 04:43:38
回答 1查看 176关注 0票数 2

我必须优化代码,因为代码的运行时间超过了10s。对于较小的输入,如果输入长度增加,则输出超过10s,则代码工作非常好(小于10s)。

代码语言:javascript
运行
复制
import re, time
#from collections import OrderedDict
final_dict = {}
k_m_n = input()
k_m_n = list(map(lambda x: int(x), re.findall(r'([0-9]+)', k_m_n)))
AI = []
start = time.time()
for i in range(k_m_n[2]):
    AI.append(int(input()))
AI_sort, l = sorted(AI), len(AI)


i = 0
while i < l:
    final_dict[AI_sort[i]] = cnt = AI_sort.count(AI_sort[i])
    i += cnt
print(final_dict)
i = 0
for k in sorted(final_dict, key=final_dict.get, reverse=True):
    if i < k_m_n[0]:
        print(k)
        i += 1

print(time.time()-start)

如果输入是

k_m_n = 3 3 8AI.append(int(input())) = 2 2 1 1 1 5 5 5.效果很好。

如果输入是k_m_n = 999 999 256000AI.append(int(input()))= 1..999..1...999(那么时间会超过10s)。请帮帮忙。

代码语言:javascript
运行
复制
K = 3: Number of output I want to see
m = 3: Number of different types of numbers
n = 8: List of numbers

Suppose 
AI.append(int(input())) = 2 2 1 1 1 5 5 5
Here there are 3 types of number provided (2,1,5) # m
Total numbers in the list are = 8 # n
Outputs required in lexical order here is 1 5 2 #k.. although 1 and 5 are repeated 3 times but I need to print 1 then 5 then 2
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-05 04:58:57

您的主要罪魁祸首是计数代码,如果n是输入的数量,而m是唯一输入的数量,则计数代码不必要地使用n进行缩放。即,这一部分:

代码语言:javascript
运行
复制
i = 0
while i < l:
    final_dict[AI_sort[i]] = cnt = AI_sort.count(AI_sort[i])
    i += cnt

这个实现完全遍历列表,为列表中的每个唯一元素计算元素,从而导致m*n迭代总数(对于更大的示例来说,结果是大约2.56亿次迭代)。

切换到这个实现解决了这个问题,并大大提高了运行时(不过,我一开始并没有给您的10+时间,但这可能是硬件性能的差异):

代码语言:javascript
运行
复制
final_dict = {}
for a in AI_sort:
    final_dict[a] = final_dict.get(a, 0) + 1

话虽如此,但是,还有其他一些不必要的事情,也是程序做的。它可以用这种方式编写的代码少得多:

代码语言:javascript
运行
复制
import collections

k, m, n = [int(x) for x in input().split()]
occurrences = collections.Counter(int(input()) for i in range(n))
for num, seen in occurrences.most_common(k):
    print(seen)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37638535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档