Mic*_*bom 21 python optimization performance
我正在研究一个SPOJ问题,INTEST.目标是指定测试用例的数量(n)和除数(k),然后为程序提供n个数字.该程序将接受stdin换行符上的每个数字,并在收到第n个数字后,将告诉您有多少可被k整除.
这个问题唯一的挑战是让你的代码变得快速,因为k可以是高达10 ^ 7的任何东西,并且n可以高达10 ^ 9.
我正在尝试用Python编写它并且无法加速它.有任何想法吗?
编辑2:我终于在10.54秒时通过了它.我几乎把你所有的答案都用到了那里,因此很难选择一个"正确",但我相信我选择的那个总结得最好.谢谢大家.最终传递代码如下.
编辑:我在包含的代码中包含了一些建议的更新.
不允许使用扩展程序和第三方模块.代码也由SPOJ评判机器运行,所以我没有更改解释器的选项.
import sys
import psyco
psyco.full()
def main():
    from sys import stdin, stdout
    first_in = stdin.readline()
    thing = first_in.split()
    n = int(thing[0])
    k = int(thing[1])
    total = 0
    list = stdin.readlines()
    for item in list:
        if int(item) % k == 0:
            total += 1
    stdout.write(str(total) + "\n")
if __name__ == "__main__":
    main()
rbp*_*rbp 14
[编辑反映新发现并在spoj上传递代码]
通常,在使用Python for spoj时:
使用(某些)这些指导原则,我设法通过了INTEST.不过还在测试替代品.
嘿,我知道它在时间限制内.我使用了以下内容:
最后一个是有所作为的.我认为它与变量可见性有关,但我不完全确定.我的时间是10.81秒.你可以通过列表理解让它更快.
编辑:
使用列表理解使我的时间缩短到8.23秒.将from sys import stdin, stdout功能内部的线条稍微削掉,使我的时间缩短到8.12秒.
使用psyco,它会JIT你的代码,当有大循环和计算时非常有效.
编辑:看起来不允许第三方模块,
因此,您可以尝试将循环转换为列表推导,它应该在C级别运行,因此它应该更快一点.
sum(1 if int(line) % k == 0 else 0 for line in sys.stdin)