有条件的任务有限制Время: 1 сек. Память: 16 Мб。
任务链接
健康)状况:
你得到一个整数序列。数字按顺序编号,从一开始。
需要编写一个程序来求最大偶数和最小奇数之和 - max{a2, a4, ...} + min{a1, a3, ...} .
有 2 个代码选项可以解决这个问题(实际上还有更多,但这些比其他更接近满足要求):
时码:
in_file = open('INPUT.TXT')
num_set = in_file.read().split()
max_even, min_odd = int(max(tuple(num_set[i] for i in range(1, len(num_set), 2)), key=int)), \
int(min(tuple(num_set[i] for i in range(0, len(num_set), 2)), key=int))
open('OUTPUT.TXT', 'w').write(str(sum([max_even, min_odd])))
时间:0.093 - 内存:17 Mb
代码二:
in_file = open('INPUT.TXT')
num_set = in_file.read().split()
in_file.close()
evens = []
odds = []
while len(num_set) > 0:
odds.append(num_set.pop(0))
if len(num_set) > 0:
evens.append(num_set.pop(0))
open('OUTPUT.TXT', 'w').write(str(sum([max(map(int, evens)), min(map(int, odds))])))
时间:1.218 - 内存:8.3 MB
问题:
有什么方法可以优化资源使用?
这是我的解决方案:
时间:0.343
内存:5.8 MB
编码:
通过以二进制读取模式打开文件进行优化:
时间:0.296
内存:4178 KB
通过使用模块进行优化
mmap:时间:0.296
内存:1934 KB
PS。
split当我用数字 ( )做一行时,我总是内存不足num_set = f.read().split(),所以我决定躲开并制作一个数字迭代器。立即想到什么 -finditer来自正则表达式模块。而且因为 根据任务,偶数和奇数一个接一个,然后我想用
next它可以一个接一个地请求以下值,直到它们用完(StopIteration)以二进制模式打开
'INPUT.TXT'会减少总时间和内存消耗:0,343->0,296和5,8 Мб->4178 Кб。在该测试系统上每次运行的时间和内存结果可能略有不同。
相同的代码与 PyPy 兼容,并且在 PyPy 上运行得更快:
0,296->0,203和1934 Кб->1753 Кб内存:12 MB
时间
: 此选项的0.125 :
这里的拆分和转换是由模块的“手”完成的
csv,但是自动转换到类型float,虽然我认为这不会影响“比较”操作的速度。但是什么记忆如此消耗 - 理解起来会很有趣。